【发布时间】:2016-02-21 21:22:17
【问题描述】:
一个明显的方法是:
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
有没有更好的方法使用 Fortran 的移位运算符?
This question 几乎相同,但使用无符号整数。不幸的是,符号位会禁止使用相同的算法。
【问题讨论】:
-
非负操作数上的 RSHIFT 相当于逻辑右移,所以我看不出有什么问题
-
看一下标准函数
ILEN,应该和你需要的很接近(+/- 1)。 -
@njuffa 那是 HPF 内在函数,而不是 Fortran 内在函数?所以它可能不会被广泛支持。
-
@francescalus 好点。我不经常使用 Fortran,并认为这是 Fortran 2003 的一部分,但也许它只是 HPF 扩展。我近年来使用的所有 Fortran 编译器都可以使用它,所以如果它是一个扩展,它似乎是一个常见的扩展(可能需要检查编译器标志设置以启用 HPF 功能)。
-
你可以在循环中使用
btest。
标签: performance fortran bit-manipulation fortran90 logarithm