下面的C程序在我的Mac和Linux上產生不同的結果。我驚訝,因爲我認爲的libm
實施以某種方式標準化Mac和Linux上exp函數的結果略有不同
#include<math.h>
#include<stdio.h>
int main()
{
double x18=-6.899495205106946e+01;
double x19 = exp(-x18);
printf("x19 = %.15e\n", x19);
printf("x19 hex = %llx\n", *((unsigned long long *)(&x19)));
}
在Mac上的輸出是
x19 = 9.207186811339878e+29
x19 hex = 46273e0149095886
,並在Linux上
x19 = 9.207186811339876e+29
x19 hex = 46273e0149095885
兩個不使用任何優化彙編標誌如下:
gcc -lm ....
我知道我永遠不應該比較漂浮在一起的漂浮物。
在調試過程中出現了這個問題,令人遺憾的是使用這種計算證明的算法在數值上不穩定,這種細微的差異導致最終結果出現明顯的偏差。但這是一個不同的問題。
我只是驚訝,因爲exp
等基本操作不規範,我可以期待通過IEEE 754
規定的基本代數運算是否有關於精密任何假設我可以依靠的不同實現libm
爲不同的機器或不同的版本?
由於討論下面我用mpmath
計算值比機器精度更高,我得到兩個數字,結果9.2071868113398768244
,所以我的兩個結果的最後數字已經是錯誤的。在Linux上的結果可以通過舍入這個值來解釋,如果計算機使用四捨五入,Mac的結果也是關閉的。
那麼......標準操作列在https://en.wikipedia.org/wiki/IEEE_754-1985#Standard_operations。你在問什麼? –
對不起,增加了額外的句子。 – rocksportrocker
順便說一句,您可以使用'%a'格式說明符在十六進制中打印「精確」浮點值。 –