ホームページ > バックエンド開発 > C++ > 多精度浮動小数点 (mpfl) 加算がキャリー ビットを正しく伝播できないのはなぜですか?

多精度浮動小数点 (mpfl) 加算がキャリー ビットを正しく伝播できないのはなぜですか?

Linda Hamilton
リリース: 2024-12-07 05:23:14
オリジナル
522 人が閲覧しました

Why Does My Multi-Precision Floating-Point (mpfl) Addition Fail to Propagate Carry Bits Correctly?

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変更

  • ALU の使用: ALU32 クラスは ALU アーキテクチャを実装しており、実際の ALU と同様の方法で算術演算を実行できます。
  • キャリー保存: adc() 関数は次のとおりです。
  • オーバーフロー処理: increment() 関数は、2 つの 8 ビット値の合計が 255 を超えているかどうかを確認します。 、キャリービットは次の桁に伝播されます。

以上が多精度浮動小数点 (mpfl) 加算がキャリー ビットを正しく伝播できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート