Double での小数位の操作: 丸め誤差の解決
精度は、特に浮動小数点データを扱う場合、数値演算の重要な側面です。ダブルのようなタイプ。乗算や除算を使用して小数点以下の桁を移動しようとすると、丸め誤差という問題が発生します。この記事では、double での小数点以下の桁の移動の微妙な違いを検証し、丸め誤差を軽減するテクニックを検討します。
問題: 乗算を使用した小数点以下の桁の移動
1234 が存在するシナリオを考えてみましょう。 double に格納されており、目標は小数点を移動して 12.34 を取得することです。以下のコード スニペットに示すように、1234 に 0.1 を 2 回乗算しても、期待どおりの結果 12.34 が得られません。
double x = 1234; for(int i=1;i原因: 浮動小数点表現の不正確さ
根本的な問題は、0.1 を double で正確に表現できないことです。乗算を 2 回実行すると、この誤差がさらに大きくなり、最終的な値にわずかな誤差が生じます。
解決策: 10 の累乗による除算
複合誤差を回避するには、除算を検討してください。代わりに x を 100 倍します。 100 は double で正確に表現できるため、このアプローチでは正しい結果が得られます。
double x = 1234; x /= 100; System.out.println(x); // Prints: 12.34BigDecimal: Handling Precise Arithmetic
絶対精度が必要なシナリオの場合は、BigDecimal の使用を検討してください。 double や float とは異なり、BigDecimal は丸めエラーなしで 10 進算術を処理できます。ただし、プリミティブ数値型と比較してパフォーマンスが低下する可能性があります。
丸め誤差: 理解と軽減
丸め誤差は浮動小数点計算に固有のものです。倍精度では 15 ~ 16 の有効数字が許容されるため、複数の操作で小さな丸め誤差が蓄積される可能性があります。上で示したように、10 の累乗による除算はこれらのエラーを軽減するのに役立ちますが、すべてのシナリオで確実に実行できるわけではありません。
除算と乗算に関する注意
重要です丸め誤差の不一致のため、x / 100 と x * 0.01 は互換性がないことに注意してください。除算は x の値に依存しますが、0.01 には固定の丸め誤差があります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3