確保.NET 中的浮點確定性
儘管浮點確定性很重要,但.NET 缺乏明確的選項來強制執行它。然而,最近的討論提出了一個潛在的解決方案:透過明確強制轉換將浮點值強制返回其本機精度。
明確轉換作為確定性機制
根據CLR 工程師David Notario,明確轉換應該觸發插入諸如conv.r4 之類的縮小指令,有效地強制將數值截斷為其本機值尺寸。這表明將所有表達式和子表達式轉換為 float 將確保確定性結果。
運行時的「提示」
但是,Eric Lippert 的聲明暗示了細微差別鑄造過程。他聲稱 C# 編譯器在發生明確轉換時向運行時提供「提示」。他建議,這個提示告訴運行時終止任何高精度模式計算。
編譯器和 CLR 規格
經檢查,C# 規格沒有明確指出提到明確強制轉換會強制插入 conv.r4。然而,編譯器中的單元測試證實了這種行為。另一方面,CLR 規範明確指出 conv.r4 將值截斷為其原始大小。
截斷保證
雖然顯式轉換可確保截斷,但它確實不保證跨機器的可重複結果。其他因素(例如 FPU/SSE 設定)可能會影響浮點運算的行為。 CLR 規範第 12.1.3 節討論了非正規數和 NaN 的意思。
替代方法
除了明確轉換之外,還可以為數組賦值(double[]或float[]),或者靜態或實例字段也會截斷浮點數值。然而,為了真正可重現的算術,建議使用整數。
以上是明確轉換如何確保 .NET 中的浮點確定性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!