来自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;
}
答案 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;
}
为了便于阅读!