我在找到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)));
}
如果我編譯和GCC 4.1.2在Linux上運行,我得到:
0.732057
Python的同意,一樣Wolfram|Alpha:
$ python2.7 -c 'print "%.06f" % (4.0/9.0)**(1/2.6)'
0.732057
不過,我得到以下結果上GCC 4.4.0在Linux和4.2.1 OS X:
0.732058
一個double
行爲相同(雖然我沒有廣泛測試此)
我不知道如何進一步縮小這個..這是一個gcc迴歸?舍入算法的改變?我做一些愚蠢的事情?
編輯:打印結果12位,在第7位的位數是4比5,這解釋了舍入的差異,而不是值差:
GCC 4.1.2:
0.732057452202
GCC 4.4.0:
0.732057511806
下面是兩個版本gcc -S
輸出:https://gist.github.com/1588729
要刪除'printf()'的行爲與變量不同,請打印或檢查包含該值的內存位,以便刪除故事中的「轉換爲字符串」部分。 – unwind 2012-01-10 12:17:51
這兩者之間的區別恰恰是32位處理器的[機器epsilon](http://en.wikipedia.org/wiki/Machine_epsilon)。此外gcc4.4的結果更接近表達式的實際值。 – 2012-01-10 12:44:05