簡體   English   中英

Math.Pow取整數值

[英]Math.Pow taking an integer value

來自http://msdn.microsoft.com/en-us/library/system.math.pow.aspx

int value = 2;
for (int power = 0; power <= 32; power++)
    Console.WriteLine("{0}^{1} = {2:N0}",
                      value, power, (long) Math.Pow(value, power));

Math.Pow將雙精度作為參數,但在這里我們傳遞的是int。

問題:如果隱式轉換為雙重發生,是否存在浮點舍入錯誤的危險?

如果是,最好使用以下內容:

public static int IntPow(int x, uint pow)
{
    int ret = 1;
    while (pow != 0)
    {
        if ((pow & 1) == 1)
            ret *= x;
        x *= x;
        pow >>= 1;
    }
    return ret;
}

不,轉換為double導致舍入錯誤的可能性不大。 double可以精確地表示屬於冪函數域的所有整數。

在您的特殊情況下,當您計算2的冪x時,您可以使用簡單的左移。 這會簡化您的代碼:

public static int TwoPowX(int power)
{
    return (1<<power);
}

是的,存在對雙重發生的隱式轉換,是的,因此存在浮點舍入錯誤的可能性。

至於是否值得使用您提出的替代方法,這是特定於應用程序。 浮點舍入誤差是完全不可接受的嗎? 你會使用適合int32的數字(溢出的權力不需要很多)嗎?

public static int IntPow(int number, uint power)
        {
            int result = 1;
            for (int i = 0; i < power; i++)
            {
                result *= number;
            }
            return result;
        }

為了便於閱讀!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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