2016-12-17 96 views
0

考慮下面的代碼:如何精確擴展mpreal的精度?

#include <iostream> 
#include <mpreal.h> 
using namespace std; 
using mpfr::mpreal; 

mpreal x("1.001",64); 
mpreal y("1.0",64); 
y*=x; 
cout<<y<<endl; //1 
y.set_prec(128); 
cout<<y<<endl; //2 

輸出是

1.001

1.00100000000000000002081668171172168513

我希望所述第二輸出是一樣的東西

1.00100000000000000000000000000000000000

事實上,我已經學會了一個可以替代

y.set_prec(128); 

y=mpreal(y.toString(),128); 

但這種轉換是耗時。

有沒有更好/更快的方法?

謝謝!

+0

當您執行'mpreal x(「1.001」,64);'時,您已經將精度丟棄了。在事實發生後你無法取回。 – user2357112

回答

0

最好全局設置精度,以便默認情況下所有的mpreal變量都將以這種精度創建。創建任何mpreal號之前調用下面的函數:

mpfr::mpreal::set_default_prec(mpfr::digits2bits(N)); 

mpreal x("1.001"); // second argument is not required anymore 
mpreal y("1.0"); 
... 

其中N是必需的十進制數字精度。

二進制浮點數不會給你實際的小數精度,它只是實數的近似值。表示中的位數越多=逼近精度越高。 但是有些數字永遠無法完全以二進制格式表示。 1.001就是其中之一。因此,您將始終看到1.001數字的二進制表示中從某個位置開始的非零。

查看What Every Computer Scientist Should Know About Floating Point Arithmetic瞭解更多詳情。

+0

好吧,設置默認精度絕對是使程序高效運行的方法。謝謝! – sunhex