[英]Is it OK to use Math.Pow (10, n)?
我需要計算功率(10,n)
可以使用Math.Pow (10, n)
嗎?
或者我應該使用循環?
for (int i = 0; i < n; i++){
x*=10;
}
哪一個更好? 為什么?
Math.Pow
更好。
這是一個經驗法則 - 在99%的場景中,支持內置函數而不是自定義實現。 這使您的代碼更清晰,節省了大量工作,並減少了出錯的機會。
只有當您考慮使用內置函數時,它們才不會被使用,或者當它們存在嚴重的延遲問題時(從未遇到過這些情況,說實話),您是否應該考慮構建自己的實現。
如果base和exponent都是整數,則可以考慮不使用Pow。 但即使在那種情況下,Pow通常更好,因為它更具可讀性。 如果至少有一個是浮點值,請使用Pow。
如果指數為0.5,則應使用Sqrt,如果指數為小整數(2,3,4),則表示具有乘法的公式更快,但可讀性更低。
如果你想用整數指數實現快速求冪,那么Square-and-Multiply算法而不是簡單的循環可能就是你想要的。 但在大多數情況下,Pow仍然更快。
對於整數,也許for循環比Math.Pow
更快,它可能處理浮點數。 但我嚴重懷疑你的情況有多大差異(盡管我不知道)。
但是如果你使用32位有符號整數,那么你只能為n <= 9存儲10 ^ n的值。但是你可以通過將這九個(十)個冪存儲在10中來獲得速度(也許是可讀性)數組。 這並不難:它們是(1),10,100,1000,....
如果需要為較大的n計算10 ^ n,則需要使用浮點數。 然后沒有任何理由不使用Math.Pow
。 這是最快的,並且易於閱讀。
取決於哪一個更清楚地傳達“10的權力”。
在我的例子中, Math.Pow(10, n)
(盡管它可能意味着數學,也可以在他們的臉上沖擊 10和n,我不知道)。
它類似於我更代數地將“10的冪與n”表示為10^n
(或10 n
)而不是10 * 10 * 10 * ... * 10 n times
,特別是考慮到n是可變的。
答案通常是肯定的,使用Math.Pow()。
但是:如果這段代碼真的是時間關鍵的,並且你知道你正在處理小功率1-9,那么結果可以在Int32中表示,那么值得優化。 我剛剛制作了一個快速的測試應用程序,並對這兩個版本進行了分析(確保編譯器沒有優化任何代碼),並且我的筆記本電腦上的最壞情況為10 ^ 9的結果是循環速度快20倍。 Math.Pow(10,9)。
但請記住,也許這個計算畢竟不是瓶頸。 如果您知道它是一個事實,例如,如果您已經分析了您的應用程序並發現它是一個真正的問題,那么繼續使用基於循環的方法替換它(或者更好的是,數組查找)。 如果你只是猜測它可能有問題,那么我建議你堅持使用Math.Pow。 通常:只優化您知道的性能瓶頸。
Math.Pow是為您提供的,並且有詳細記錄。
任何陷阱是文檔。
為什么你不希望使用所提供的功能?
有更多高性能Pow的實現方式,而不是在循環中乘以10。
例如,請參閱此答案 ,它也適用於其他基本值,而不僅僅是10。
另外,請考慮在數組中緩存結果,直到合理的數量。
這是我最近的代碼,供參考:
private static readonly Int64[] PowBase10Cache = {
1,
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
10000000000,
100000000000,
1000000000000,
10000000000000,
100000000000000,
1000000000000000,
10000000000000000,
100000000000000000,
1000000000000000000,
};
public static Int64 IPowBase10(int exp)
{
return exp < PowBase10Cache.Length ? PowBase10Cache[exp] : IPow(10L, exp);
}
public static Int64 IPow(Int64 baseVal, int exp)
{
Int64 result = 1;
while (exp > 0)
{
if ((exp & 1) != 0)
{
result *= baseVal;
}
exp >>= 1;
baseVal *= baseVal;
}
return result;
}
是的,可以使用Math.Pow()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.