ホームページ > バックエンド開発 > C++ > なぜ C では「0.3」が「0.2999999999999999889」になるのでしょうか?

なぜ C では「0.3」が「0.2999999999999999889」になるのでしょうか?

Linda Hamilton
リリース: 2024-11-04 12:03:29
オリジナル
446 人が閲覧しました

Why Does `0.3` Become `0.2999999999999999889` in C  ?

C の浮動小数点の不正確さ

プログラミングにおける浮動小数点演算では、固定ビット数を使用して実数を表現する必要があり、不正確になる可能性があります。 。この記事では、次のコードで例示される C 浮動小数点演算の精度の問題について説明します。

<code class="cpp">double a = 0.3;
std::cout.precision(20);
std::cout << a << std::endl;
ログイン後にコピー

このコードは、予想される 0.3 ではなく 0.2999999999999999889 を出力します。さらに、 a をそれ自体に 50 回加算すると、結果は予期された 15 ではなく 15.000000000000014211 になります。

説明

浮動小数点数の精度は制限されており、次のように決定されます。それらのビット数。倍精度浮動小数点数の小数部には 53 ビットがあり、有効精度は 10 進数で約 15 桁になります。

std::cout.precision(20) を使用する場合、ストリームに 20 桁の桁数を表示するように指示します。精度。ただし、 a の基になる値の精度は 15 桁のみです。追加の数字はゼロで埋められ、不正確さが生じます。

2 番目の例では、加算の繰り返しによる不正確さが蓄積されます。浮動小数点演算は結合的ではないため、加算のシーケンスがわずかに異なると、結果もわずかに異なる可能性があります。

解決策

精度の損失を最小限に抑えるには、std:: を設定しないでください。 cout.precision は数値型の利用可能な精度よりも高くなります。これは、以下を使用して実現できます。

<code class="cpp">std::cout.precision(std::numeric_limits<double>::digits10);</code>
ログイン後にコピー

これにより、倍精度浮動小数点の精度が 15 桁に制限されます。

ただし、多数の反復計算では、累積エラーが発生する可能性があります。このような場合は、固定小数点演算や整数の分子と分母を含む分数の使用などの代替手法が推奨されます。

以上がなぜ C では「0.3」が「0.2999999999999999889」になるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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