あなたの目標は、 C で大規模な精度クラスを実装することですが、数値を加算するときに問題が発生しました。 0xffffffff と 0x04 を追加すると、予期された 0x0100000003 ではなく 0xffff0003 が返されます。
コードの強調表示されているセクションは次のとおりです:
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; }
ここにありますなぜそれが誤った結果を引き起こすのかresult:
キャリー伝播: ループの各反復で、前の加算からのキャリーが現在の結果に追加される必要があります。ただし、このコードは、ret.data[i].data が 255 で、ret.data[i 1].carry が 1 の場合にのみキャリーを適用します。これは、キャリーが常に伝播されるわけではないことを意味し、不正確な答えになります。
ストレージ順序が正しくありません: mpfl クラスは数値をリトルエンディアン形式で格納しているようです。この形式では、最下位バイトが最高の指数。これは、上位バイトからのキャリーの処理が難しくなるため、加算用の数値を保存する場合には推奨されません。
これらの問題を解決するには、次の推奨事項を検討してください。
以上がC のラージ精度加算がキャリー ビットを正しく伝播しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。