我正在试着测试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,然后从pi (计算出的值,很容易检查所显示的所有小数是否正确)中减去pi(π为100位)。
输出:
3.141592653589793238462643383279502884197169399375105820974944592307816406286209
3.141592653589793115997963468544185161590576171875
1.2246467991473531772260659322750010582097494459230781640628620899862803482534212e-16问题是,pi2的小数点只有16位,我不知道为什么。
代码取自http://ubuntuforums.org/showthread.php?t=459229
我尝试过不同的启动pi2的方法,但是我无法获得超过16位数的数字。
发布于 2015-05-25 17:11:05
使用std::string而不是数字文字。aaa.bbb格式的任何值都被视为双重(有限精度),并以f后缀作为浮点数(再次限制精度)。在您的情况下,它可能被视为双倍。
const std::string number = "3.141592653589793238462643383279502884197169399375105820974944592307816406286";
mpz_class pi2(number);https://stackoverflow.com/questions/30442601
复制相似问题