ホームページ > バックエンド開発 > C++ > C で `pow()` を使用した整数演算が間違った結果を生成するのはなぜですか?

C で `pow()` を使用した整数演算が間違った結果を生成するのはなぜですか?

DDD
リリース: 2024-12-04 22:58:11
オリジナル
526 人が閲覧しました

Why Does Integer Math with `pow()` Produce Incorrect Results in C  ?

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 サイトの他の関連記事を参照してください。

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