キャリーを介して値を伝播させることはできません
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 つの大きな精度の値を加算することですが、桁上げの伝播を正しく処理できず、不正確な結果が得られます。この問題に対処するには、次の提案を検討してください。
さらに、アセンブリを使用しない高精度の乗算および除算演算については、純粋な C/C 実装については次のリンクを参照してください。 :
[Float を使用しない C での対数関数の構築タイプ](https://stackoverflow.com/questions/11762232/building-a-logarithm-function-in-c-without-using-float-type)
以上がこの C の高精度加算関数が桁上げを正しく伝播できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。