浮動小数点エラーの探索: 簡単な例
浮動小数点変数に関する会話では、「エラー」の可能性について言及することがよくあります。この概念は、特定のパズルのコンテキストなどで問題解決を練習するときに特に関連します。
次のことを考慮してください: 10 回の独立した試行でちょうど 2 回の成功が得られる確率を求めるには、次の公式を利用しました。 :
p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2);
浮動小数点エラーの問題
この例では、浮動小数点エラーが潜在的な問題になります。浮動小数点変数はコンピュータ上で実数を表すために利用されますが、記憶域スペースと処理能力の制限により、その表現は正確ではありません。その結果、浮動小数点演算を実行するとエラーが蓄積する可能性があります。
これを説明するために、対数スケールのグラフを使用して関数 f(k) を視覚化してみましょう。
[XY グラフのイメージ] X と Y を対数スケールで表します]
コンピューターが丸め誤差なしで 32 ビット浮動小数点数を完璧に表現できた場合、各 k の結果は次のようになります。 ゼロ。ただし、k が増加するにつれて、浮動小数点エラーの蓄積に起因するエラーが増大することがわかります。
C でのレプリケーション
次のコードを実装すると、この動作を C で再現できます。コード:
for (int k = 1; k < 1000; k++) { cout << "k = " << k << ", error = " << (pow(1-k, (double)8) * pow(k, (double)2) * (double)choose(8, 2)) << endl; }
結論
この簡単な例は、浮動小数点演算を実行するときに浮動小数点エラーが発生する可能性を示しています。数値計算を実装する際には、この現象を認識し、考慮することが重要です。
以上が確率計算で予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。