ホームページ > バックエンド開発 > C++ > C の整数で `std::pow` が予期しない結果を生成するのはなぜですか?

C の整数で `std::pow` が予期しない結果を生成するのはなぜですか?

Patricia Arquette
リリース: 2024-12-02 12:57:13
オリジナル
120 人が閲覧しました

Why Does `std::pow` Produce Unexpected Results with Integers in C  ?

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

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