2015-05-09 4 views
1

То, что я хочу сделать, это вычислить квадратный корень из числа N и чем мы должны хранить этот квадратный корень с P правильно десятичного values.For напримерКак сохранить номер с определенной точностью?

Lets,N=2 and P=100 

    //I want to store square root till P correct decimal values 
    like storing 
    1.41421356237309504880...till 100 values 

EDIT - Сначала я задаваемый вопрос специально для C++, но как сказали vsoftco, что это практически невозможно для C++, чтобы сделать это без boost.So я пометил питон тоже и не удален с ++ тега в надежде на правильный ответ в C++

+0

Вы также должны понимать, что Boost (или другие библиотеки) написаны на C++. Таким образом, нет другого «правильного» ответа, вы не сможете получить типы multiprecision по умолчанию, так как язык их не поддерживает (то же самое верно и для Python). У вас есть только два варианта: написать собственную библиотеку множественных значений (очень нетривиальную) или использовать ее у других сторон. – vsoftco

ответ

1

C++ использует типы floating-point (например, float, double и т. Д.) Для хранения значений с плавающей запятой и выполнения арифметики с плавающей запятой. Размер этих типов (который непосредственно влияет на их точность) определяется реализацией (обычно вы не получите более 128 бит точности). Кроме того, точность является относительным термином: когда ваши цифры растут, у вас меньше и меньше точности.

Итак, чтобы ответить на ваш вопрос: невозможно сохранить число с произвольной точностью с использованием стандартных типов C++. Для этого вам необходимо использовать библиотеку с несколькими точками, например. Boost.Multiprecision.

Пример кода с использованием Boost.Multiprecison:

#include <boost/multiprecision/cpp_dec_float.hpp> 
#include <iostream> 

int main() 
{ 
    using namespace boost::multiprecision; 
    typedef number<cpp_dec_float<100> > cpp_dec_float_100; // 100 decimal places 

    cpp_dec_float_100 N = 2; 
    cpp_dec_float_100 result = sqrt(N); // calls boost::multiprecision::sqrt 
    std::cout << result.str() << std::endl; // displays the result as a string 
} 

Если вы используете Python, вы можете использовать decimal модуля:

from decimal import * 

getcontext().prec = 100 
result = Decimal.sqrt(Decimal(2)) 
print("Decimal.sqrt(2): {0}".format(result)) 
+0

Хорошо, вы можете предложить мне какой-либо другой язык для этой цели, чем потому, что повышение не допускается :( –

+0

Благодарим за помощь. +1 –

+0

@chotabheem Я забираю это, я думаю, что у Python есть целые числа точности, а не плавающие. вам нужно использовать библиотеку 'decimal' для этого, см. [здесь] (http://stackoverflow.com/questions/11522933/python-floating-point-arbitrary-precision-available). На обычных языках программирования не реализована произвольная точность номера по умолчанию, так как они довольно медленные, и точность в большинстве случаев не имеет особого значения. – vsoftco

0

Ну, есть предлагаемое расширение C++, который определяет decimal type семья описан в http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2849.pdf. В современной версии gcc есть определенная поддержка, однако она все еще не заполнена даже в 4.9.2.

Возможно, это будет возможно для вас.