【发布时间】:2012-01-10 11:50:56
【问题描述】:
我正在调查why a test case is failing
有问题的测试可以简化为执行(4.0/9.0) ** (1.0/2.6),将其四舍五入为 6 位并检查已知值(作为字符串):
#include<stdio.h>
#include<math.h>
int main(){
printf("%.06f\n", powf(4.0/9.0, (1.0/2.6)));
}
如果我在 Linux 上的 gcc 4.1.2 中编译并运行它,我会得到:
0.732057
Python 同意,Wolfram|Alpha 也同意:
$ python2.7 -c 'print "%.06f" % (4.0/9.0)**(1/2.6)'
0.732057
但是,我在 Linux 上的 gcc 4.4.0 和 OS X 上的 4.2.1 上得到以下结果:
0.732058
double 行为相同(尽管我没有对此进行广泛测试)
我不确定如何进一步缩小范围。这是 gcc 回归吗?舍入算法的变化?我做了什么傻事?
编辑:将结果打印为 12 位,第 7 位的数字是 4 vs 5,这解释了舍入差异,但不是值差异:
gcc 4.1.2:
0.732057452202
gcc 4.4.0:
0.732057511806
这是两个版本的gcc -S 输出:https://gist.github.com/1588729
【问题讨论】:
-
要删除行为不同的
printf()作为变量,打印或检查保存该值的内存位,因此您删除了故事的“转换为字符串”部分。 -
这两者之间的区别正是 32 位处理器的 machine epsilon。而且gcc4.4的结果更接近表达式的实际值。
标签: c++ c gcc floating-point precision