std::pow を使用した予期しない整数演算結果の説明
C コードでは、整数演算が浮動小数点数と組み合わせると予期しない動作をすることがあります。ポイント操作。次のコード スニペットを考えてみましょう:
#include <iostream> #include <cmath> int main() { int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); std::cout << i << std::endl; }
このコードは、予期される "123" ではなく "122" を出力します。これは、 std::pow() が無限の精度を持たない浮動小数点数で動作するためです。 std::pow() の実装により、整数演算に現れる不正確さが生じる可能性があります。
カスタム整数累乗関数を使用した解決策
この問題を解決するには、次のことをお勧めします。カスタムの整数累乗関数を定義します。この関数は正確な整数計算を提供します。 C 11 以降では、constexpr 整数累乗関数を定義できます。
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
パフォーマンスの最適化
パフォーマンスを向上させるために、末尾再帰バージョンを利用できます。のfunction:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
結論
カスタムの整数累乗関数を採用することで、整数計算を正確に実行し、浮動小数点演算と分解能の精度制限に対処できます。整数演算の std::pow() で発生する予期しない結果。
以上がC の整数で `std::pow` が予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。