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