Dot-Net

C雙打與.NET雙打不同嗎?

  • June 7, 2012

比較一些 C 程式碼和我試圖替換它的 F#,我觀察到最終結果存在一些差異。

備份程式碼,我發現即使存在差異 - 儘管很小。

程式碼首先從文件中讀取數據。第一個數字的結果不同。例如,在 F# 中(更易於編寫腳本):

let a = 71.9497985840
printfn "%.20f" a

我得到了預期的(對我而言)輸出71.94979858400000000000

但在 C 中:

a =  71.9497985840;
fprintf (stderr, "%.20f\n", a);

列印出來71.94979858400000700000

那個 7 是從哪裡來的?

差異很小,但它困擾著我,因為我不知道為什麼。(這也讓我很困擾,因為它讓我更難追踪我的兩個版本的程式碼在哪里分歧)

這是印刷的區別。將該值轉換為 IEEE754double產生

Prelude Text.FShow.RealFloat> FD 71.9497985840
71.94979858400000694018672220408916473388671875

但該表示71.949798584足以將該數字與其鄰居區分開來。C,當被要求以小數點後 20 位的精度列印時,將值正確舍入為所需的位數,顯然 F# 使用最短的唯一確定表示並用所需的 0 數填充它,就像 Haskell 一樣.

引用自:https://stackoverflow.com/questions/10897052