gpt4 book ai didi

c++ - std::pow 在 32 位和 64 位应用程序中产生不同的结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:42 28 4
gpt4 key购买 nike

我发现一些复杂计算的结果不匹配。当我彻底观察中间结果时,是 std::pow 函数造成了不匹配。以下是输入/输出。

long double dvalue = 2.7182818284589998;
long double dexp = -0.21074699576017999;
long double result = std::powl( dvalue, dexp);

64bit -> result = 0.80997896907296496 and 32bit -> result = 0.80997896907296507

我正在使用 VS2008。我已经尝试使用 pow 函数的其他变体,它接受 long double 并返回 long double,但仍然看到相同的差异。

double pow(双底,双指数);

long double powl( long double base, long double exponent );

我已经阅读了一些关于此的信息:

Intel x86 processors use 80-bit extended precision internally, whereas double is normally 64-bit wide.Different optimization levels affect how often floating point values from CPU get saved into memory and thus rounded from 80-bit precision to 64-bit precision. Alternatively, use the long double type, which is normally 80-bit wide on gcc to avoid rounding from 80-bit to 64-bit precision.

有人可以让我清楚地了解差异以及克服这种差异的方法。

最佳答案

可能发生的情况是,32 位版本使用 80 位 FPU 寄存器进行计算,而 64 位版本使用 64 位值的 SIMD 操作,这导致了轻微的差异。请注意,这两个答案均保留 14 位小数,这是您对 64 位浮点值所能期望的最佳值。

Visual C++ 提供 compiler options这让您可以说出您更喜欢浮点运算的速度、一致性还是精度。使用这些选项(例如,/fp:strict),如果这对您很重要,您可能会在两个构建之间获得一致的值。

另请注意,VC++2008 相当旧。较新的版本修复了许多错误,包括一些与浮点有关的错误。 (自 2008 年以来,开源软件中流行的 strtod 实现已经发现并修复了错误。)除了 80 位和 64 位操作之间的精度差异外,您可能还会遇到解析和显示问题错误。尽管如此,浮点还是很难的,而且bugs persist .

关于c++ - std::pow 在 32 位和 64 位应用程序中产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33887108/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com