簡體   English   中英

.NET中嚴格浮點數學的庫

[英]Library for strict floating point Math in .NET

我有Java的算法/計算和單元測試。 單元測試期望結果具有一定的精度/ delta。 現在我將算法移植到.NET中,並希望使用相同的單元測試。 我使用雙數據類型。

問題是Java對Math類中的某些操作使用strictfp(64位)。 .NET使用FPU / CPU總是(80位)。 .NET更精確,更快捷。 Java更具可預測性。

因為我的算法是循環的並且重用前一輪的結果,所以誤差/差異/更高精度累積太大。 我不依賴速度(單元測試)。 我很高興在生產中使用.NET精度,但我想驗證實現。

從JDK考慮這個


public final class Math {
    public static double atan2(double y, double x) {
    return StrictMath.atan2(y, x); // default impl. delegates to StrictMath
    }
}

我正在尋找在.NET中使用嚴格FP的庫或技術

搶先評論: 我確實理解IEEE 754格式以及浮點數不是精確的十進制數或分數這一事實。 沒有十進制,沒有BigInt或BigNumber。 請不要這樣回答,謝謝。

今年早些時候我已經對這個問題進行了廣泛的研究,因為我想知道是否有可能在.NET中的浮點運算上建立多人模擬。 我的一些發現可能對您有用:

可以通過在任何地方插入冗余的強制轉換來模擬“嚴格”模式 ,但這似乎是一個脆弱的,C#特定且繁瑣的解決方案。

32位JIT發出x87指令,但64位JIT發出SSE指令。 在Microsoft和Mono的實現上都是如此。 與x87不同, SSE浮動算法是可重現的

我相信System.Math只是調用等效的C運行時函數,雖然我無法進入程序集來驗證這一點(如果有人知道如何執行此操作,請檢查!)。 C運行時盡可能使用SSE版本的超越函數,除了少數情況,特別是sqrt(但是通過instrinsics寫一個包裝器是微不足道的)。 根據SSE的本質,這些必須是可重復的。 可編程地確定C運行時是使用其SSE實現而不是x87

對於SSE中不可用的剩余超越函數(fmod,sinh,cosh,tanh),如果在x87上沒有對其結果執行進一步操作,它們可能不會導致重現性問題。

所以簡而言之,堅持使用64位CLR可以解決算術問題; 對於超越函數,大多數已經在SSE中實現,如果你不對結果執行任何x87算術,我甚至不確定這是必要的。

遺憾的是,沒有辦法在C#中強制執行FP嚴格性,.Net CLR只是缺乏以最小的精度進行計算的能力。

我認為這有一個性能提升 - 它不會檢查你可能想要更低的精度。 也沒有必要 - .Net不在虛擬機中運行,因此不用擔心不同的浮點處理器。

但是不是strictfp可選嗎? 你可以在沒有strictfp修飾符的情況下執行你的Java代碼嗎? 然后它應該采用與.Net相同的浮點機制

因此,不要強迫.Net使用strictfp並檢查它與Java代碼具有相同的值,您可以強制Java不使用strictfp並檢查它是否與.Net代碼相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM