首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GMP mpf_class精度低于预期?

GMP mpf_class精度低于预期?
EN

Stack Overflow用户
提问于 2015-05-25 16:43:04
回答 1查看 775关注 0票数 0

我正在试着测试GMP是否符合我想要的精度和下一个程序:

代码语言:javascript
复制
#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位)。

输出:

代码语言:javascript
复制
3.141592653589793238462643383279502884197169399375105820974944592307816406286209
3.141592653589793115997963468544185161590576171875
1.2246467991473531772260659322750010582097494459230781640628620899862803482534212e-16

问题是,pi2的小数点只有16位,我不知道为什么。

代码取自http://ubuntuforums.org/showthread.php?t=459229

我尝试过不同的启动pi2的方法,但是我无法获得超过16位数的数字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-25 17:11:05

使用std::string而不是数字文字。aaa.bbb格式的任何值都被视为双重(有限精度),并以f后缀作为浮点数(再次限制精度)。在您的情况下,它可能被视为双倍。

代码语言:javascript
复制
const std::string number = "3.141592653589793238462643383279502884197169399375105820974944592307816406286";
mpz_class pi2(number);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30442601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档