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