请考虑以下代码:
#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 :(得分: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 了解详情。