首頁 >後端開發 >C++ >為什麼「std::pow()」使用整數數學會產生不正確的結果?

為什麼「std::pow()」使用整數數學會產生不正確的結果?

Linda Hamilton
Linda Hamilton原創
2024-12-26 19:11:10492瀏覽

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);
}

替代尾遞歸形式

這個函數也可以用尾遞歸的形式實現,在某些情況下效率更高情況:

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn