ホームページ > Java > &#&チュートリアル > 丸め誤差を最小限に抑えながら倍精度の小数点以下の桁を正確にシフトするにはどうすればよいですか?

丸め誤差を最小限に抑えながら倍精度の小数点以下の桁を正確にシフトするにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-24 22:38:11
オリジナル
787 人が閲覧しました

How Can I Accurately Shift Decimal Places in Doubles While Minimizing Rounding Errors?

Double での小数位の操作: 丸め誤差の解決

精度は、特に浮動小数点データを扱う場合、数値演算の重要な側面です。ダブルのようなタイプ。乗算や除算を使用して小数点以下の桁を移動しようとすると、丸め誤差という問題が発生します。この記事では、double での小数点以下の桁の移動の微妙な違いを検証し、丸め誤差を軽減する手法を検討します。

問題: 乗算を使用した小数点以下の桁の移動

1234 が次のようなシナリオを考えてみましょう。 double に格納されており、目標は小数点を移動して 12.34 を取得することです。以下のコード スニペットに示すように、1234 に 0.1 を 2 回乗算しても、期待どおりの 12.34 という結果は得られません。

double x = 1234;
for(int i=1;i<=2;i++) {
  x = x*.1;
}
System.out.println(x); // Prints: 12.340000000000002
ログイン後にコピー

原因: 浮動小数点表現の不正確さ

根本的な問題は、0.1 を double で正確に表現できないことです。乗算を 2 回実行すると、この誤差がさらに増大し、最終的な値にわずかな誤差が生じます。

解決策: 10 のべき乗による除算

誤差の複合を避けるために、除算を検討してください。代わりに x を 100 倍します。 100 は double で正確に表現できるため、このアプローチでは正しい結果が得られます。

double x = 1234;
x /= 100;
System.out.println(x); // Prints: 12.34
ログイン後にコピー

BigDecimal: 正確な算術演算

絶対精度が必要なシナリオの場合は、次の使用を検討してください。 BigDecimal。 double や float とは異なり、BigDecimal は丸めエラーなしで 10 進算術を処理できます。ただし、プリミティブ数値型と比較してパフォーマンスが低下する可能性があります。

丸め誤差: 理解と軽減

浮動小数点計算には丸め誤差がつきものです。倍精度では 15 ~ 16 の有効数字が許容されるため、複数の操作で小さな丸め誤差が蓄積される可能性があります。上で示したように、10 の累乗による除算はこれらのエラーを軽減するのに役立ちますが、すべてのシナリオで確実に実行できるわけではありません。

除算と乗算に関する注意

重要です丸め誤差の不一致のため、x / 100 と x * 0.01 は互換性がないことに注意してください。除算は x の値に依存しますが、0.01 には固定の丸め誤差があります。

以上が丸め誤差を最小限に抑えながら倍精度の小数点以下の桁を正確にシフトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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