2016-12-17 60 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