簡體   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