Я пытаюсь проверить, является ли GMP работает с точностью я хочу или не со следующей программой:GMP mpf_class точность ниже, чем ожидалось?
#include<gmpxx.h>
#include<iostream>
#include<iomanip>
int main()
{
long prec = 1000;
mpf_set_default_prec(prec);
mpf_class a(1);
mpf_class b(mpf_class(1)/sqrt(mpf_class(2)));
mpf_class t(mpf_class(1)/mpf_class(4));
mpf_class p(1);
mpf_class x,y,pi, pi2, sub;
pi2 = mpf_class(3.141592653589793238462643383279502884197169399375105820974944592307816406286);
while (a - b > mpf_class(1e-250))
{
x = (a + b)/2;
y = sqrt(a*b);
t = t - p*(a-x)*(a-x);
a = x;
b = y;
p *=2;
}
pi = (a+b)*(a+b)/(mpf_class(4)*t);
sub = pi - pi2;
std::cout << std::setprecision(80) << pi << '\n' << pi2 << '\n' << sub << '\n';
return 0;
}
Он вычисляет пи с количеством цифр, а затем вычитает pi2
(пи с 100 цифр) от pi
(рассчитанное значение, легко проверить, что все показанные десятичные знаки верны).
Выход:
3.141592653589793238462643383279502884197169399375105820974944592307816406286209
3.141592653589793115997963468544185161590576171875
1.2246467991473531772260659322750010582097494459230781640628620899862803482534212e-16
Проблема заключается в том, что он работает только с 16 знаков после запятой для pi2
, и я не знаю, почему.
Код был взят из http://ubuntuforums.org/showthread.php?t=459229
Я пробовал различные способы инициирования pi2
, но я не могу управлять, чтобы получить больше, чем 16 цифр.
Или в C++ 11 вы можете написать '3.141592653589793238462643383279502884197169399375105820974944592307816406286_mpf'. –