3 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
通常pow(double, double),數(shù)學(xué)庫(kù)中函數(shù)的實(shí)現(xiàn)基于身份:
pow(x,y) = pow(a, y * log_a(x))
使用此標(biāo)識(shí),您只需要知道如何將單個(gè)數(shù)字a升為任意指數(shù),以及如何采用對(duì)數(shù)底數(shù)即可a。您已經(jīng)有效地將一個(gè)復(fù)雜的多變量函數(shù)轉(zhuǎn)換為一個(gè)變量和一個(gè)乘法的兩個(gè)函數(shù),這很容易實(shí)現(xiàn)。最常見(jiàn)的選擇值a是e或2- e因?yàn)閑^x和log_e(1+x)有一些非常漂亮的數(shù)學(xué)特性,并且2因?yàn)樗哂杏糜诟↑c(diǎn)運(yùn)算執(zhí)行一些不錯(cuò)的性能。
做這種方式的缺點(diǎn)是,(如果你想獲得完全精確),你需要計(jì)算的log_a(x)項(xiàng)(以及它與產(chǎn)品y)比的浮點(diǎn)表示更高的精度x和y。例如,如果x和y是雙精度數(shù),并且想要獲得高精度結(jié)果,則需要想出一些方法以更高精度的格式存儲(chǔ)中間結(jié)果(并進(jìn)行算術(shù)運(yùn)算)。Intel x87格式和64位整數(shù)一樣是常見(jiàn)的選擇(盡管如果您確實(shí)想要高質(zhì)量的實(shí)現(xiàn),則需要執(zhí)行一些96位整數(shù)計(jì)算,這在某些情況下會(huì)有些痛苦語(yǔ)言)。如果實(shí)施powf(float,float),則處理起來(lái)要容易得多,因?yàn)槟菢泳涂梢允褂胐ouble用于中間計(jì)算。如果您要使用這種方法,我建議從此開始。
我概述的算法不是唯一可行的計(jì)算方法pow。它只是最適合提供滿足固定先驗(yàn)精度范圍的高速結(jié)果。它在某些其他情況下不太合適,并且比其他一些人建議的重復(fù)平方根算法肯定更難實(shí)現(xiàn)。
如果要嘗試使用重復(fù)平方[root]算法,請(qǐng)首先編寫一個(gè)僅使用重復(fù)平方的無(wú)符號(hào)整數(shù)冪函數(shù)。一旦掌握了這種簡(jiǎn)化情況的算法,您就會(huì)發(fā)現(xiàn)將其擴(kuò)展為處理分?jǐn)?shù)指數(shù)非常簡(jiǎn)單。
- 3 回答
- 0 關(guān)注
- 824 瀏覽
添加回答
舉報(bào)