[英]How can I compute a base 2 logarithm without using the built-in math functions in C#?
如何在不使用C#内置数学函数的情况下计算基数为2的对数?
我在应用程序中反复使用Math.Log和BigInteger.Log数百万次,它变得非常缓慢。
我对使用二进制操作来实现相同的替代方法感兴趣。 请记住,如果有助于加快执行时间,我可以使用日志近似值。
假设你只对对数的组成部分感兴趣,你可以这样做:
static int LogBase2(uint value)
{
int log = 31;
while (log >= 0)
{
uint mask = (1 << log);
if ((mask & value) != 0)
return (uint)log;
log--;
}
return -1;
}
(注意0的返回值是错误的;它应该是负无穷大,但是对于整数数据类型没有这样的值,所以我返回-1代替)
对于BigInteger,您可以使用toByteArray()方法,然后手动查找最重要的1并计算之后的零数。 这将为您提供具有整数精度的base-2对数。
如果您可以使用近似值进行到期,则使用英特尔芯片使用的技巧:将值预先计算为合适大小的数组,然后引用该数组。 您可以使用任何最小/最大值来开始和结束数组,并且可以根据需要创建任意数量的中间值以获得所需的精度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.