Math.Pow取整数值

时间:2012-06-25 20:17:54

标签: c# floating-accuracy pow

来自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将双精度作为参数,但在这里我们传递了整数。

问题:如果隐式转换为双重发生,是否存在浮点舍入错误的危险?

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

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;
}

4 个答案:

答案 0 :(得分:5)

不,转换为double导致舍入错误的可能性不大。 double可以精确地表示属于幂函数域的所有整数。

答案 1 :(得分:5)

在您的特殊情况下,当您计算2的幂x时,您可以使用简单的左移。这会将您的代码简化为:

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

答案 2 :(得分:4)

是的,存在对双重发生的隐式转换,是的,因此可能会出现浮点舍入错误。

至于是否值得使用您提出的替代方法,这是特定于应用程序的。浮点舍入误差是完全不可接受的吗?你会使用适合int32的数字(溢出的权力并不需要很多)吗?

答案 3 :(得分:-1)

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

为了便于阅读!