我试图用下一个程序测试GMP是否符合我想要的精度:
#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;
}
它计算具有多个数字的pi,然后从pi2
减去pi
(100位数的pi)(计算出的值,很容易检查显示的所有小数是否正确)。< / p>
输出:
3.141592653589793238462643383279502884197169399375105820974944592307816406286209
3.141592653589793115997963468544185161590576171875
1.2246467991473531772260659322750010582097494459230781640628620899862803482534212e-16
问题是pi2
只使用了16位小数,我不知道为什么。
代码取自http://ubuntuforums.org/showthread.php?t=459229
我已尝试过不同的方式发起pi2
,但我无法获得超过16位的数据。
答案 0 :(得分:1)
使用std::string
代替数字文字。格式aaa.bbb的任何值都被视为double(有限精度)并且f
后缀为float(再次限制精度)。在你的情况下,它可能被视为双倍。
const std::string number = "3.141592653589793238462643383279502884197169399375105820974944592307816406286";
mpz_class pi2(number);