一些比較C代碼和F#我試圖來取代它,我觀察到有最終結果有所不同。C雙打與.NET雙打不同嗎?
工作備份代碼,我發現即使在有些差異 - 儘管很小。
代碼從讀取文件中的數據開始。而第一個數字則不同。例如,在F#(更容易腳本):
let a = 71.9497985840
printfn "%.20f" a
我得到預期的(對我來說)輸出71.94979858400000000000
。
但在C:
a = 71.9497985840;
fprintf (stderr, "%.20f\n", a);
打印出71.94979858400000700000
。
在這情況下7從何而來?
區別只是很小,但它困擾我,因爲我不知道爲什麼。 (它也困擾我,因爲它使得我更難追查我的兩個版本的代碼在哪裏發散)
你確定這兩個值是雙重的嗎?你確定錯誤不在打印? – Euphoric
.net中的浮點運算沒有明確定義的精確結果。這只是一個近似值。編譯器和JITer的意想不到的更低的數字可能會發生變化,只是用'printfn'來觀察它們會影響它們。 – CodesInChaos
使用調試器或其他東西來查看變量的確切位模式。如果您使用相同的浮點格式和變量的F#和C實現都具有完全相同的位模式,則差異在於打印或編譯器如何解析浮點文字。無論哪種情況,由於浮點數只是近似值,所以可能不需要擔心,因爲它們之間的差異很小。 –