GMP mpf_class精度低于预期值?

时间:2015-05-25 16:43:05

标签: c++ precision gmp

我试图用下一个程序测试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位的数据。

1 个答案:

答案 0 :(得分:1)

使用std::string代替数字文字。格式aaa.bbb的任何值都被视为double(有限精度)并且f后缀为float(再次限制精度)。在你的情况下,它可能被视为双倍。

const std::string number = "3.141592653589793238462643383279502884197169399375105820974944592307816406286";
mpz_class pi2(number);