ホームページ > バックエンド開発 > C++ > `std::pow()` が整数演算で間違った結果を生成するのはなぜですか?

`std::pow()` が整数演算で間違った結果を生成するのはなぜですか?

Linda Hamilton
リリース: 2024-12-26 19:11:10
オリジナル
482 人が閲覧しました

Why Does `std::pow()` Produce Incorrect Results with Integer Math?

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

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