3 回答

TA貢獻1856條經驗 獲得超11個贊
通常pow(double, double),數學庫中函數的實現基于身份:
pow(x,y) = pow(a, y * log_a(x))
使用此標識,您只需要知道如何將單個數字a升為任意指數,以及如何采用對數底數即可a。您已經有效地將一個復雜的多變量函數轉換為一個變量和一個乘法的兩個函數,這很容易實現。最常見的選擇值a是e或2- e因為e^x和log_e(1+x)有一些非常漂亮的數學特性,并且2因為它具有用于浮點運算執行一些不錯的性能。
做這種方式的缺點是,(如果你想獲得完全精確),你需要計算的log_a(x)項(以及它與產品y)比的浮點表示更高的精度x和y。例如,如果x和y是雙精度數,并且想要獲得高精度結果,則需要想出一些方法以更高精度的格式存儲中間結果(并進行算術運算)。Intel x87格式和64位整數一樣是常見的選擇(盡管如果您確實想要高質量的實現,則需要執行一些96位整數計算,這在某些情況下會有些痛苦語言)。如果實施powf(float,float),則處理起來要容易得多,因為那樣就可以使用double用于中間計算。如果您要使用這種方法,我建議從此開始。
我概述的算法不是唯一可行的計算方法pow。它只是最適合提供滿足固定先驗精度范圍的高速結果。它在某些其他情況下不太合適,并且比其他一些人建議的重復平方根算法肯定更難實現。
如果要嘗試使用重復平方[root]算法,請首先編寫一個僅使用重復平方的無符號整數冪函數。一旦掌握了這種簡化情況的算法,您就會發現將其擴展為處理分數指數非常簡單。
- 3 回答
- 0 關注
- 816 瀏覽
添加回答
舉報