2011-02-16 69 views
13

如果我運行一個複雜的計算Windows下涉及.NET的System.Double(x86和x64),然後在Mono(LINUX,UNIX,等等),我是絕對保證得到準確同樣的結果在所有情況下,或者規範是否允許在計算中有一些餘地?.NET是獨立於平臺/架構的「雙重」算法嗎?

回答

14

MSDN

此外,從算術, 分配,和解析操作 結果與Double值的精度 損失可以通過 平臺不同。例如, 賦予文本Double值可以 結果在32位和64位 版本的.NET框架

希望有所幫助的不同。

+3

請注意,結果*始終保證符合IEEE-754規範,但該規範允許一定的餘地(例如,允許結果比指定的更精確最小精度)。 – LukeH 2011-02-16 14:44:09

5

不,它不一樣。它可以編譯成x87或SSE指令,其工作方式不同(例如關於denorm支持)。我沒有辦法強制.net使用可重現的浮點數學。

有一些替代品,但個個都是緩慢的,有些是大量的工作:

  • 實現自己的浮點/定點數字。
    • 32位固定不太難編碼。但是他們有限的範圍和精度使他們很難合作。 LogSqrt會很慢。如果你想,我可以挖出我未完成的代碼。
    • 64位定點更適合使用。但是你不能以字節碼的高性能方式輕鬆實現它們,因爲一些中間值是CLR不支持的96-128位。
    • 浮點數(我會研究32位尾數和16位指數)很好用,但很難實現。既然爲了避免精度損失,你需要一個快速的方法來找到最高的非零位。 C#/ .net中沒有BitScanForward/Reverse內部函數。
  • 將所有的數學代碼移動到本地庫中,因爲從我讀的內容可以強制大多數C++編譯器創建可重現的浮點代碼。
  • Decimal在軟件中實現,因此也可能重現,但它也不是很快。
0

我不這麼認爲。這樣的短語爲:

內部浮點 表示的大小是依賴於實現的,可以變化,並應具有精度至少一樣大的 變量或表達式被表示

和:

該設計允許CLI選擇浮點數的平臺特定高性能表示,直到它們被放置在存儲器中ocations。例如,它可能會將浮點變量保留在硬件寄存器中,提供比用戶要求的更高的精度。在 同時,CIL發電機可以強制操作通過 尊重的表示特定語言的規則,使用轉換指令

從MS分區第12.1.3我會傾向於表明可能發生整差異如果所有操作發生在內部表示中