我有一个 long double 恒定,我设置无论是作为格或不const。它的长(40位),比的精确度 long double 在我的测试工作站(19位)。

当我打印出来的,它不再是显示在19位精度,但至16.

这里是我的测试:

#include <iostream>
#include <iomanip>
#include <limits>
#include <cstdio>

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

    std::cout << std::numeric_limits<long double>::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 --version
g++ (GCC) 3.4.6 20060404 (Red Hat 3.4.6-10)

我可以看看NTL或其他图书馆但我很好奇是什么造成这一点。谢谢你的洞察力。

有帮助吗?

解决方案

我得到这样的输出:

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

但我使用长双文字而不是双文字:

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

其他提示

有一些微妙的问题有关的硬件平台,并编制选项,可能会感兴趣:

这些`-m'的项定义i386和x86-64家庭的计算机:

-m96bit长双

-m128bit长双

这些开关控制的尺寸长的双类型。I386应用程序接口 指定的尺寸,以96位,所以 -m96bit长双是默认在其中的32位的模式。现代化的体系结构 (奔腾并更新)将喜欢长 双要对准一个或16 8 字节的边界。在阵或结构 符合《,这不会 可能的。因此指定一个 -m128bit长双将长一倍,一个16字节的边界通过 填补长的双重用 另外的32位零。

在x86-64编译器, -m128bit长双是默认选择,作为其ABI指定长 双应对齐月16字节 边界。

请注意,无论这些选项 启用任何额外精密的 x87标准的80位长 一倍。

警告:如果复盖默认 值为你的目标ABI, 结构和阵列包含长 双变量将改变他们 大小以及功能叫 《公约》对于功能的长 双将进行修改。因此,他们 将不兼容 阵列或结构在代码汇编 没有那个开关。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top