从双精度初始化GMP浮点变量(mpf_t或mpf_class,无关紧要)的正确方法是什么?
代码:
#include <iostream>
#include <gmpxx.h>
int main()
{
double d=0.1;
//1024 bits is more that 300 decimal digits
mpf_set_default_prec(1024);
mpf_class m(d);
//after initializing mpf_class variable, set default output precision
std::cout.precision(50);
std::cout.setf(std::ios_base::scientific);
std::cout << m << std::endl;
return 0;
}输出为:
1.00000000000000005551115123125782702118158340454102e-01如果我直接打印d就可以了,但是在m变量中,尾数的300位十进制数字是可信的!我将GMP用于迭代数值方法,因此这些非零值引入了错误,使方法收敛缓慢。
如果我将m初始化为mpf_class m("0.1");,则输出为:
1.00000000000000000000000000000000000000000000000000e-01所以问题不在于mpf_class的operator<<过载。这个问题不仅存在于初始化,也存在于赋值。
目前,我使用以下几种方法:
mpf_class linsys::DtoGMP(const double& arg)
{
char buf[512];
sprintf(buf,"%.15le\n",arg);
return mpf_class(buf);
}进行正确的转换。
有没有更快和/或更本地化的方法呢?
我的操作系统是OpenSUSE 12.1,编译器: gcc 4.6.2
发布于 2020-01-10 07:12:13
您可以使用此方法
mpf_class a; double d=0.1; a=static_cast<mpf_class>(d*10)/static_cast<mpf_class>(10);如果您知道双精度数的小数位数,则可以使用此方法
https://stackoverflow.com/questions/13663146
复制相似问题