ホームページ > バックエンド開発 > C++ > `std::pow` が整数演算で予期しない結果をもたらすのはなぜですか?

`std::pow` が整数演算で予期しない結果をもたらすのはなぜですか?

Barbara Streisand
リリース: 2024-12-03 10:33:11
オリジナル
120 人が閲覧しました

Why Does `std::pow` Give Unexpected Results with Integer Math?

std::pow を使用した整数演算が予期しない結果を生成する理由

整数演算に std::pow を使用すると、予期しない出力が発生する可能性があります。このシナリオでは、 i = 23 1 * 10^2 を設定しようとするコード スニペットの結果は 123 ではなく 122 になります。

この動作は、std::pow の浮動小数点の性質に起因しており、本質的に無限を欠いています。精度。非効率な実装により、この問題が悪化する可能性があります。

整数べき乗関数の実装

これに対処するために、カスタムの整数べき乗関数を定義できます。 C 11 以降では、constexpr 関数によりコンパイル時に結果を計算できるようになります。

constexpr int int_pow(int b, int e)
{
    return (e == 0) ? 1 : b * int_pow(b, e - 1);
}
ログイン後にコピー

末尾再帰バリエーション

Dan による代替末尾再帰形式Nissenbaum により、より効率的な計算が可能になります:

constexpr int int_pow(int b, int e, int res = 1)
{
    return (e == 0) ? res : int_pow(b, e - 1, b * res);
}
ログイン後にコピー

これら代替手段は正確な整数べき乗計算を提供し、std::pow で発生する問題を解決します。

以上が`std::pow` が整数演算で予期しない結果をもたらすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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