首頁 > 後端開發 > C++ > 為什麼 C 中的整數 `std::pow` 會產生意外的結果?

為什麼 C 中的整數 `std::pow` 會產生意外的結果?

Patricia Arquette
發布: 2024-12-02 12:57:13
原創
114 人瀏覽過

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;
}
登入後複製

此程式碼輸出「122」而非預期的「123」。這是因為 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);
}
登入後複製

效能最佳化

為了提高效能,您可以使用尾遞歸版本的函數:

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板