如何精确地扩展Mpreal的精度

How to extend the precision of mpreal precisely?

本文关键字:精度 Mpreal 扩展 何精确      更新时间:2023-10-16

考虑以下代码:

#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.00100000000000000208166817172168513

我希望第二个输出类似于

1.00100000000000000000000000000000000000

实际上,我了解到可以替换

y.set_prec(128);

to

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

但是这种转换很耗时。

是否有更好/更快的方法?

谢谢!

最好在全球设置精度,因此默认情况下,所有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数字的二进制表示中的某个位置开始的非零件。

查看每个计算机科学家对浮点算术的了解的信息。