[英]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.