簡體   English   中英

可以使用Math.Pow(10,n)嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM