首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将double精确转换为mpf_class

将double精确转换为mpf_class
EN

Stack Overflow用户
提问于 2012-12-02 03:55:58
回答 1查看 1.7K关注 0票数 1

从双精度初始化GMP浮点变量(mpf_t或mpf_class,无关紧要)的正确方法是什么?

代码:

代码语言:javascript
复制
#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;
}

输出为:

代码语言:javascript
复制
1.00000000000000005551115123125782702118158340454102e-01

如果我直接打印d就可以了,但是在m变量中,尾数的300位十进制数字是可信的!我将GMP用于迭代数值方法,因此这些非零值引入了错误,使方法收敛缓慢。

如果我将m初始化为mpf_class m("0.1");,则输出为:

代码语言:javascript
复制
1.00000000000000000000000000000000000000000000000000e-01

所以问题不在于mpf_classoperator<<过载。这个问题不仅存在于初始化,也存在于赋值。

目前,我使用以下几种方法:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 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);如果您知道双精度数的小数位数,则可以使用此方法

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13663146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档