如何准确地扩展mpreal的精度?

时间:2016-12-17 06:36:15

标签: c++ gmp mpfr

请考虑以下代码:

#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);

但这种转换非常耗时。

有更好/更快的方法吗?

谢谢!

1 个答案:

答案 0 :(得分: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 了解详情。