当前位置:  开发笔记 > 编程语言 > 正文

长双输出的精度不正确.可能有什么问题?

如何解决《长双输出的精度不正确.可能有什么问题?》经验,为你挑选了1个好方法。

我有一个long double常量,我设置为const或not-const.它比long double我的测试工作站(19位)的精度更长(40 位).

当我打印出来时,它不再以19位精度显示,而是以16位显示.

这是我正在测试的代码:

#include 
#include 
#include 
#include 

int main ()
{
    const long double constLog2 = 0.6931471805599453094172321214581765680755;
    long double log2 = 0.6931471805599453094172321214581765680755;    

    std::cout << std::numeric_limits::digits10 + 1 << std::endl;
    std::cout << "const via cout: " << std::setprecision(19) << constLog2 << std::endl;
    std::cout << "non-const via cout: " << std::setprecision(19) << log2 << std::endl;
    std::fprintf(stdout, "const via printf: %.19Lf\n", constLog2);
    std::fprintf(stdout, "non-const via printf: %.19Lf\n", log2);

    return 0;
}

编译:

$ g++ -Wall precisionTest.cpp

输出:

$ ./a.out
19
const via cout: 0.6931471805599452862
non-const via cout: 0.6931471805599452862
const via printf: 0.6931471805599452862
non-const via printf: 0.6931471805599452862

我希望,0.6931471805599453094但相反0.6931471805599452862.

是否有理由将19位精度切割为16位?

这是我的环境:

$ gcc --version
i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5490)

我看到其他版本的gcc也存在同样的问题,例如:

$ gcc --version
g++ (GCC) 3.4.6 20060404 (Red Hat 3.4.6-10)

我可以查看NTL或其他库,但我很好奇是什么导致了这一点.感谢您的见解.



1> Johannes Sch..:

我得到这个输出:

19
const via cout: 0.6931471805599453094
non-const via cout: 0.6931471805599453094
const via printf: 0.6931471805599453094
non-const via printf: 0.6931471805599453094

但我使用long double literals而不是double literals:

const long double constLog2 = 0.6931471805599453094172321214581765680755L;
long double log2 = 0.6931471805599453094172321214581765680755L;    

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有