Math.Pow()
.NET中的内置函数double
为double
指数提供基础并返回double
结果.
使用整数执行相同操作的最佳方法是什么?
补充:似乎可以将Math.Pow()
结果转换为(int),但这总是产生正确的数字而没有舍入错误?
一个非常快的可能是这样的:
int IntPow(int x, uint pow) { int ret = 1; while ( pow != 0 ) { if ( (pow & 1) == 1 ) ret *= x; x *= x; pow >>= 1; } return ret; }
请注意,这不允许负功率.我会把它作为练习留给你.:)
补充:哦,是的,差点忘了 - 还要添加溢出/下溢检查,否则你可能会遇到一些令人讨厌的惊喜.
LINQ有人吗?
public static int Pow(this int bas, int exp) { return Enumerable .Repeat(bas, exp) .Aggregate(1, (a, b) => a * b); }
用作扩展名:
var threeToThePowerOfNine = 3.Pow(9);
使用John Cook的博客链接中的数学,
public static long IntPower(int x, short power) { if (power == 0) return 1; if (power == 1) return x; // ---------------------- int n = 15; while ((power <<= 1) >= 0) n--; long tmp = x; while (--n > 0) tmp = tmp * tmp * (((power <<= 1) < 0)? x : 1); return tmp; }
如果你改变了电源的类型,那么代码就不会起作用的反对意见......撇开任何更改代码的人,他们不理解然后在没有测试的情况下使用它......
但是要解决这个问题.问题,这个版本保护愚蠢的人免受这个错误......(但不是来自他们可能做的其他人)注意:没有经过测试.
public static long IntPower(int x, short power) { if (power == 0) return 1; if (power == 1) return x; // ---------------------- int n = power.GetType() == typeof(short)? 15: power.GetType() == typeof(int)? 31: power.GetType() == typeof(long)? 63: 0; long tmp = x; while (--n > 0) tmp = tmp * tmp * (((power <<= 1) < 0)? x : 1); return tmp; }
也尝试这个递归等价物(当然慢):
public static long IntPower(long x, int power) { return (power == 0) ? x : ((power & 0x1) == 0 ? x : 1) * IntPower(x, power >> 1); }
lolz,怎么样:
public static long IntPow(long a, long b) { long result = 1; for (long i = 0; i < b; i++) result *= a; return result; }
这是一篇博客文章,解释了将整数提升为整数幂的最快方法.正如其中一条评论指出的那样,其中一些技巧是内置于芯片中的.