[英]c++: strategies for stability of floating point arithmetic
任何人都可以推薦任何包含維護各種浮點運算穩定性的策略的C ++庫/例程/包嗎?
示例:假設您希望在單位間隔(0,1)中對一百萬個long double
精度的矢量/數組求和,並且每個數字的大小大致相同。 天然求和for (int i=0;i<1000000;++i) sum += array[i];
是不可靠的 - 對於足夠大的i
, sum
將比array[i]
具有更大的數量級,因此sum += array[i]
將等於sum += 0.00
。 (注意:此示例的解決方案是二進制求和策略。)
我處理數千/數百萬微小概率的總和和產品。 我使用具有2048位有效數的任意精度庫MPFRC++
,但同樣的問題仍然適用。
我主要關心的是:
二元求和並不能保證准確的結果。 最可靠(盡管速度較慢)的方法是使用Kahan求和 。 Boost.Accumulators有上面的實現和更多。
乘法和除法穩定性:除非你得到非規范化的浮點數,否則它們不會遇到與求和和減法相同的問題。 事實上,乘法誤差最多為0.5 ulp(單位最后一位)。
......我的歸一化常數應該是多少?
'normalize'是什么意思? 這取決於您使用的規范 。 可能的候選者:使用數組中的最大絕對值,或任何其他廣義均值。 (您列出的其他選項不起作用,因為即使非零數組也可能為零。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.