有没有办法写log(base 2)函数?
C语言有2个内置函数 - >>
1. log基础e.
2. log10基数10;
但我需要基数2的日志功能.如何计算这个.
我正在使用相当新的Visual C++ 2008 Express安装.
我正在尝试编译一个使用log2函数的程序,该程序是通过在Mac上使用Eclipse而找到的,但是这台Windows计算机找不到该函数(错误C3861:'log2':未找到标识符).
我理解它的方式,包括目录是IDE特有的,对吧?我的Microsoft SDKs\Windows\v6.0A\Include \目录中没有math.h,但我确实在这个目录中找到了math.h:Microsoft Visual Studio 9.0\VC\include.该目录中还有一个cmath ......
log2在哪里?
计算浮点数的基数2对数的整数部分的有效方法是什么?就像是
N = ceil( log2( f ))
Run Code Online (Sandbox Code Playgroud)
要么
N = floor( log2( f ))
Run Code Online (Sandbox Code Playgroud)
浮点数f.我想这可能会以某种方式非常有效地实现,因为可能只需要访问浮点指数.
编辑2:我对准确性并不感兴趣.我可以容忍+ -1的错误.我列举了这两个变种只是作为一个例子,因为一个可能在计算上比另一个更便宜(但我不知道).
我需要这个用于算法的精确控制,其中参数f是一些容差,并且需要日志来控制术语的数量.准确计算日志并不重要.
编辑:这不是要求整数参数的log2的其他许多问题的重复(例如,如何在C++中执行整数log2()?).这是关于浮点论证和完全不同的故事.具体来说,我需要f <1,这对于整数方法是不可能的
一个显而易见的方法是:
integer function log2_i(val) result(res)
implicit none
integer, intent(IN) :: val
if (val<0) then
print *, "ERROR in log2_i(): val cannot be negative."
else if (val==0) then
print *, "ERROR in log2_i(): todo: return the integer equivalent of (-inf)..."
else if (val==1) then
res = 0
else
res = FLOOR( LOG(val+0.0d0)/LOG(2.0d0) )
endif
end function log2_i
Run Code Online (Sandbox Code Playgroud)
使用Fortran的位移操作符有更好的方法吗?
这个问题几乎相同,但使用无符号整数.不幸的是,符号位将禁止使用相同的算法.
考虑下面的等式:
2**n = A.
我们假设A = 64.
找到n值的最简单方法是什么?
我目前正在使用以下两种方法
A= 64; n = 1; n+=1 while (A >> n) > 0; n-1
A= 64; n = 0; n+=1 until (A == ( 2 ** n));n
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?
说明同样问题的其他方式:
2 =第n个根A如果我知道A的值,我该如何确定n的值?
说我得到n = 32.我想知道log_2(n)是什么.在这种情况下,log_2(32)= 5.
一般来说,计算2 ^ k数的对数的最快方法是什么?
即给定n = 2 ^ k.log_2(n)= b.找到b.
允许按位操作.