pow() を使用した整数演算により不正確な結果が生じる
次のコード スニペットを検討してください。
int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); cout << i << endl;
予想通り、このコードは「123」を出力するはずですが、代わりに驚くべきことに出力されます。 「122」この予期しない結果は、特に Windows XP 環境で g 4.7.2 を使用してコンパイルしている場合に戸惑うかもしれません。
この矛盾の核心は、std::pow() が処理するように設計されているという事実です。浮動小数点数。これらの浮動小数点数は利便性を提供しますが、精度が制限されるというトレードオフが伴います。 std::pow() の場合、実装はべき乗を完全な精度で処理できない可能性があり、丸め誤差が発生します。
この問題に対処するには、C 11 の能力を利用して独自の整数を定義することができます。べき乗関数:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
このカスタム int_pow 関数は整数専用に調整されており、正確さを保証します。
代わりに、Dan Nissenbaum によって提案された末尾再帰アプローチも実行可能な解決策です。
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
これらのオプションを使用すると、C で整数のべき乗を自信を持って使用できるようになります。プログラムを修正し、誤った結果を忘れられたバグの領域に追放します。
以上がC で `pow()` を使用した整数演算が間違った結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。