ホームページ > バックエンド開発 > C++ > この C の高精度加算関数が桁上げを正しく伝播できないのはなぜですか?

この C の高精度加算関数が桁上げを正しく伝播できないのはなぜですか?

Susan Sarandon
リリース: 2025-01-04 06:55:39
オリジナル
546 人が閲覧しました

Why Does This C   Large Precision Addition Function Fail to Propagate Carry Correctly?

キャリーを介して値を伝播させることはできません

C で高精度の mpfl クラスを作成しようとした最近の試みで、開発者は次のような問題に遭遇しました。 0xffffffff と 0x04 を追加すると、予想される値ではなく 0xffff0003 が生成される問題0x0100000003。この操作を担当する加算関数の概要を以下に示します。

mpfl operator+(const mpfl &lhs, const mpfl &rhs)
{
    unsigned long i;
    mpfl ret(0);
    mpfl trhs(rhs);
    for (i = lhs.nbytes; i >= 0; i--)
    {
        if (
            (unsigned short)lhs.data[i].data + (unsigned short)trhs.data[i].data
            > (unsigned short)255
        ) {
            if (i > 0)
            {
                ret.data[i].carry = 1;
                ret.data[0].carry = 0;
            }
            else
            {
                ret.data[0].carry = 1;
            }
        }
        else
            ret.data[i].carry = 0;
        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);
            ret.data[i].data += ret.data[i + 1].carry;
        }
        if (i == 0) break;
    }
    return ret;
}
ログイン後にコピー

この関数の目的は 2 つの大きな精度の値を加算することですが、桁上げの伝播を正しく処理できず、不正確な結果が得られます。この問題に対処するには、次の提案を検討してください。

  • ALU アーキテクチャの実装: 実際のハードウェアと同様の算術論理演算装置 (ALU) アーキテクチャを使用してコードを最適化します。このアプローチにより、計算が簡素化され、効率が向上します。
  • 常にキャリーを適用: 加算関数では、最初の反復を除いてキャリーが一貫して適用されるようにします。正しい結果を得るには、後続の加算でキャリーを考慮する必要があります。
  • 桁の順序を確認: 数値の桁が正しい順序で保存および処理されていることを確認します。通常、これらは最下位桁から最上位桁の順に追加する必要があります。

さらに、アセンブリを使用しない高精度の乗算および除算演算については、純粋な C/C 実装については次のリンクを参照してください。 :

[Float を使用しない C での対数関数の構築タイプ](https://stackoverflow.com/questions/11762232/building-a-logarithm-function-in-c-without-using-float-type)

以上がこの C の高精度加算関数が桁上げを正しく伝播できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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