繁体   English   中英

如何在不使用C#内置数学函数的情况下计算基数为2的对数?

[英]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对数。

bit hacks页面对于这样的事情非常有用。

代码存在于C中,但基本思想也适用于C#。

如果您可以使用近似值进行到期,则使用英特尔芯片使用的技巧:将值预先计算为合适大小的数组,然后引用该数组。 您可以使用任何最小/最大值来开始和结束数组,并且可以根据需要创建任意数量的中间值以获得所需的精度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM