mpfl 加算におけるキャリー伝播の問題
mpfl 加算関数でキャリー値を正しく伝播する際に問題が発生し、その結果、合計が不正確になります。具体的には、2 つの 32 ビット値を加算した後、結果が 1 つの 32 ビット値の範囲を超える場合、キャリー ビットが適切に伝播されず、不正確な合計が発生します。
アーキテクチャ アプローチ
この問題を解決するには、ハードウェアで使用されているものと同様の ALU (算術論理演算ユニット) アーキテクチャを検討することが有益です。実装。 ALU の演算後にコードをモデル化することで、計算を簡素化し、精度を向上させることができます。
コードの修正
次のコードは改訂版を提供します。桁上げ伝播の問題に対処する加算関数:
mpfl operator+(const mpfl &lhs, const mpfl &rhs) { unsigned long i; mpfl ret(0); mpfl trhs(rhs); ALU32 alu; for (i = lhs.nbytes; i >= 0; i--) { alu.adc(ret.data[i].data, lhs.data[i].data, trhs.data[i].data); if (i < lhs.nbytes) { if (ret.data[i].data == 255 && ret.data[i + 1].carry == 1) increment(&trhs, i + 1); } } return ret; }
Key変更
以上が多精度浮動小数点 (mpfl) 加算がキャリー ビットを正しく伝播できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。