如何精确扩展mpreal的精度?

How to extend the precision of mpreal precisely?

考虑以下代码:

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

但是这种转换比较耗时

有better/faster方法吗?

谢谢!

最好全局设置精度,这样所有 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 了解更多详情。