std::pow() による整数演算により不正確な結果が得られる
提供されたコード スニペット内:
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() の使用にあります。この関数は、無限の精度を持たない浮動小数点数を処理するように設計されています。これは g 4.7.2 (MinGW、Windows XP) の実装上の潜在的な欠陥であるにもかかわらず、根本的な原因は浮動小数点計算の精度が制限されていることです。
解決策: 整数累乗関数
この問題を解決するには、整数の正確な結果を得るために整数累乗関数を実装できます。 C 11 以降では、この関数を constexpr として定義でき、可能であればコンパイル時に結果を計算できるようになります:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
Alternative Tail-Recursive Form
この関数は末尾再帰形式で実装することもでき、一部の機能ではより効率的です。状況:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
std::pow() の代わりにこれらの整数累乗関数を使用すると、コードは浮動小数点計算に伴う精度の問題なく、正しい出力「123」を生成します。
以上が`std::pow()` が整数演算で間違った結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。