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