2015-05-25 1 views
0

Я пытаюсь проверить, является ли 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 цифр.

ответ

1

Используйте цифру std::string вместо цифры. Любое значение формата aaa.bbb рассматривается как двойное (ограниченная точность) и суффикс f как float (снова ограниченная точность). В вашем случае это, вероятно, рассматривается как двойное.

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

Или в C++ 11 вы можете написать '3.141592653589793238462643383279502884197169399375105820974944592307816406286_mpf'. –

Смежные вопросы