std::pow による整数演算の精度の問題を理解する
std::pow() で整数算術演算を実行する場合、プログラマは予期せぬ結果に遭遇する。これは、std::pow() が浮動小数点数をネイティブに処理するためであり、有限精度による潜在的な問題が発生します。
次の例を考えてみましょう。
#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; }
このコードは計算を試みます。 i の値は 23 1 * 10^2 です。ただし、出力は予期された「123」ではなく「122」になります。これは、 std::pow() が浮動小数点数で動作するため、計算結果に若干の誤差が生じる可能性があるためです。
この問題を解決するには、次のことを保証する整数固有の pow 関数を使用することをお勧めします。正確な整数ベースの計算。これを実現する 1 つの方法は、整数の乗算を再帰的に実行するカスタム pow 関数を作成することです。
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
このカスタム関数により、浮動小数点演算に伴う潜在的な精度の問題が発生することなく、正確な整数計算が保証されます。
以上がstd::pow() が整数演算で予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。