【发布时间】:2016-02-26 12:10:59
【问题描述】:
我发现一些复杂计算的结果不匹配。当我彻底观察中间结果时,它的 std::pow 函数会造成这种不匹配。 以下是输入/输出。
long double dvalue = 2.7182818284589998;
long double dexp = -0.21074699576017999;
long double result = std::powl( dvalue, dexp);
64 位 -> 结果 = 0.80997896907296496 和 32 位 -> 结果 = 0.80997896907296507
我正在使用 VS2008。 我尝试过使用 long double 并返回 long double 的 pow 函数的其他变体,但仍然看到相同的差异。
double pow( double base, double exponent );
long double powl( long double base, long double exponent );
我已经阅读了一些关于此的信息:
Intel x86 处理器在内部使用 80 位扩展精度,而 double 通常是 64 位宽。不同的优化级别会影响 来自 CPU 的浮点值多久保存到内存中,以及 因此从 80 位精度四舍五入到 64 位精度。或者, 使用 long double 类型,在 gcc 上通常为 80 位宽 避免从 80 位精度舍入到 64 位精度。
谁能让我清楚地理解差异以及克服这种差异的方法。
【问题讨论】:
-
您是否检查过 32 位编译器与 64 位编译器的浮点编译器开关是否相同?