首页 文章

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

提问于
浏览
0

请考虑以下代码:

#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

    最好全局设置精度,以便默认情况下将以这种精度创建所有 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 .

相关问题