10

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

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

如果是,最好使用类似的东西:

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

4 回答 4

7

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

public static int TwoPowX(int power)
{
    return (1<<power);
}
于 2015-07-02T06:09:24.487 回答
5

不,转换为double. double可以精确地表示落在幂函数域内的所有整数。

于 2012-06-25T21:02:29.603 回答
4

是的,有一个隐式转换为双重发生,是的,结果可能会出现浮点舍入错误。

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

于 2012-06-25T20:20:24.237 回答
-1
public static int IntPow(int number, uint power)
        {
            int result = 1;
            for (int i = 0; i < power; i++)
            {
                result *= number;
            }
            return result;
        }

为了可读性!

于 2012-06-25T21:00:59.257 回答