我正在尝试在 Fortran 中编写一个函数,它将最终确定一个整数是否是 2 的幂。此代码在 2^28 范围内有效,但在 2^29 范围内失败:
real(kind(1.q0)) elemental function fractional_part(x)
real(kind(1.q0)), intent(in) :: x
fractional_part = x-floor(x)
end function fractional_part
program frac
implicit none
real(kind(1.q0)) :: fractional_part
integer :: ii
logical :: pof2
read(5,*) ii
pof2 = (fractional_part(log(real(ii,16))/log(2.q0)) == 0.0q0)
if(pof2) write(6,*) ii
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,它依赖于整数到实数(16)的转换以及势必有噪声的对数函数。
如果您的输入为非负数,您可以使用 popcnt() 来计算位数。
program test
integer i
do i = 1, 2 ** 30
if ( popcnt(i) == 1 ) print *, i
end do
end program test
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |