如何精确扩展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 了解更多详情。
考虑以下代码:
#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 了解更多详情。