ホームページ > バックエンド開発 > C++ > 浮動小数点演算では 0.1 が正確に表現されないのに、0.5 は正確に表現されるのはなぜですか?

浮動小数点演算では 0.1 が正確に表現されないのに、0.5 は正確に表現されるのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-15 07:49:13
オリジナル
137 人が閲覧しました

Why is 0.1 not represented exactly in floating-point arithmetic, while 0.5 is?

浮動小数点精度: 0.5 は正確で、0.1 は正確ではない理由

浮動小数点演算は多くの計算では効率的ですが、すべての 10 進数を正確に表現するには固有の制限に直面しています。 この記事では、0.5 が正確な表現を享受できる一方で、0.1 がそうでない理由を探ります。

0.1 の表現を理解する

IEEE 754 標準は、浮動小数点数の格納方法を規定しています。 0.1 の表現を調べてみましょう:

<code>s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111011 10011001100110011001101</code>
ログイン後にコピー
  • 符号: 0 (正)。
  • 指数 (eeeee): 123. バイアス (127) を減算すると、実効指数は -4 になります。
  • 仮数 (mmmmmmmmmmmmmmmmmmmmmm): 暗黙的に先頭に「1」を付けた 2 進分数として解釈されます。 仮数ビットの合計は約 1.60000002384185791015625 となります。

仮数に 2-4 を掛けると、およそ 0.100000001490116119384765625 となります。 これは 0.1 に近似していますが、完全に一致するわけではありません。 バイナリ表現に固有の制限により、10 進数の 0.1.

からの完全な変換は妨げられます。

0.5 の正確な表現

対照的に、0.5 は次のように単純に表現されます。

<code>s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 00000000000000000000000</code>
ログイン後にコピー
  • 符号: 0 (正)。
  • 指数 (eeeee): 126. 有効指数 (バイアス調整後) は -1 です。
  • 仮数 (mmmmmmmmmmmmmmmmmmmmmm): 0.

これは 1 * 2-1 = 0.5 に変換され、完全な表現となります。

結論: 2 進精度の限界

違いは、特定の小数を正確に表現するバイナリ システムの機能にあります。 0.5 (1/2) は 2 のべき乗なので 2 進数で簡単に表現できますが、0.1 (1/10) はそうではありません。 これにより、0.1 を浮動小数点形式で格納するときにわずかな丸め誤差が発生し、近似値が観察されます。 プログラマーは、浮動小数点数や精度が重要なアプリケーションを扱う場合、この固有の制限に注意する必要があります。

以上が浮動小数点演算では 0.1 が正確に表現されないのに、0.5 は正確に表現されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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