2014-10-31 92 views
-3

如果exponent是int,那麼我可以運行循環「ex」次。如何實現double Pow(double base,double ex)

如果base = 2,EX = 0.5這樣:

2^0.5 = sqrt(2) 

如果base = 2,EX = 1.5這樣:

2^1.5 = sqrt(2^3) 

所有我認爲是與一些如果它(如果前int?if ex negative?)

是否有一個很好的方法來實施Pow?

+10

爲什麼不使用['Math.Pow'](http://msdn.microsoft.com/en-us /library/system.math.pow(v=vs.110).aspx)? – Dmitry 2014-10-31 22:36:34

+0

這個問題似乎是離題,因爲它可能更適合http://math.stackexchange.com/ – 2014-10-31 22:44:26

+0

@LB IEEE 754數學與真正的數學沒有多大關係...... – 2014-10-31 22:54:39

回答

5

案例1
a^b天然B(也即,一個int型,以及^意味着權力不XOR):
正如你所說的,它可以用一個簡單的重複乘法解決。但考慮更有效的方法,如正方形和乘法:
想想c * a^b變量c爲1;當然還有以下是有效的:
a^0=1a^1=aa^bb>1a * a^(b-1)

如果B是偶數,a^b(a^2)^(b/2),在代碼風格(a*a)^(b>>1)。如果您想到變量a和b,只需製作a=a*a;b=b>>1;,並且只用一次乘法和移位即可將指數減半。 而不是(b/2)循環迭代。只要重複整個事情,直到你經常將b分爲1,那麼a就是你的結果。

如果b在某個過程中甚至沒有出現:
現在c很重要:最初它是1,現在是1,它現在乘以a。 c=c*a;
如果您記得c * a^b,現在可以將b減1,因爲其中有一個a。
現在繼續像上面那樣的偶數b ...
每次你有一個不均勻的指數,讓c積累的因素得到一個偶數b。
如果b爲最後1,c*a是你的最終結果(it's c*a每次:如果沒有凹凸不平B,C仍然是1)

案例2
a^b陰性B(無論是自然不)
這很容易:a^(-b) = 1/(a^b)是一個基本的數學規則。
也就是說。忽略b先是負數,但是取反的結果。

案例3
通用實數。
那麼,在理論a^b = e^(b*ln(a))
Exp
Log
有它自然的指數,所以...

實際上,它效率低下並且存在一個巨大的問題:計算機具有有限的小數精度,在計算過程中需要比實際結果更高的精度。如果你想要20個精確的十進制數字,你需要用例如精確的計算。 30(或其他一些數字> 20)。其他方式:如果你用你的CPU所能做的所有事情來計算,結果就不會那麼準確(最後一些錯誤的數字)。如果您正在編寫一些bignum庫,您可能可以爲較小的預期結果分配一個大型數據類型,但不適用於內置的CPU類型。

Math.pow這樣的方法的真正實現是適用於某些CPU類型的高度專業化的算法,因此實際的錯誤數字錯誤保持儘可能小。另外,它也應該很快,這使得整個代碼更加複雜。想知道它的外觀如何:
http://opensource.apple.com/source/Libm/Libm-2026/Source/Intel/expf_logf_powf.c
要理解它的工作原理,需要相當多的數學和技術知識。
如果你沒有很好的理由,別的花時間可能是更多的樂趣:)

+0

謝謝你的回答,這就是我想知道的情況3! – 2014-11-01 06:43:34

相關問題