如果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?
如果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?
案例1:
a^b
天然B(也即,一個int
型,以及^意味着權力不XOR):
正如你所說的,它可以用一個簡單的重複乘法解決。但考慮更有效的方法,如正方形和乘法:
想想c * a^b
變量c爲1;當然還有以下是有效的:
a^0=1
,a^1=a
和a^b
與b>1
是a * 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))
和
有它自然的指數,所以...
實際上,它效率低下並且存在一個巨大的問題:計算機具有有限的小數精度,在計算過程中需要比實際結果更高的精度。如果你想要20個精確的十進制數字,你需要用例如精確的計算。 30(或其他一些數字> 20)。其他方式:如果你用你的CPU所能做的所有事情來計算,結果就不會那麼準確(最後一些錯誤的數字)。如果您正在編寫一些bignum庫,您可能可以爲較小的預期結果分配一個大型數據類型,但不適用於內置的CPU類型。
像Math.pow
這樣的方法的真正實現是適用於某些CPU類型的高度專業化的算法,因此實際的錯誤數字錯誤保持儘可能小。另外,它也應該很快,這使得整個代碼更加複雜。想知道它的外觀如何:
http://opensource.apple.com/source/Libm/Libm-2026/Source/Intel/expf_logf_powf.c
要理解它的工作原理,需要相當多的數學和技術知識。
如果你沒有很好的理由,別的花時間可能是更多的樂趣:)
謝謝你的回答,這就是我想知道的情況3! – 2014-11-01 06:43:34
爲什麼不使用['Math.Pow'](http://msdn.microsoft.com/en-us /library/system.math.pow(v=vs.110).aspx)? – Dmitry 2014-10-31 22:36:34
這個問題似乎是離題,因爲它可能更適合http://math.stackexchange.com/ – 2014-10-31 22:44:26
@LB IEEE 754數學與真正的數學沒有多大關係...... – 2014-10-31 22:54:39