【发布时间】:2016-08-27 10:50:02
【问题描述】:
我想在 MATLAB 中找到与 dec2bin(d,n) 类似的函数,它为 Fortran 生成至少具有 n 位的二进制表示。网上找了this code,它把十进制转二进制,但没有决定位数的机制,它要求用户判断是正整数还是正实数...
【问题讨论】:
标签: matlab binary fortran decimal
我想在 MATLAB 中找到与 dec2bin(d,n) 类似的函数,它为 Fortran 生成至少具有 n 位的二进制表示。网上找了this code,它把十进制转二进制,但没有决定位数的机制,它要求用户判断是正整数还是正实数...
【问题讨论】:
标签: matlab binary fortran decimal
这是一个基于 B 编辑运算符的解决方案(根据高性能标记的评论),它需要一个相当新的编译器。
!> Returns a binary representation of d as a string with at least n bits.
!> abs(d) < 2^52
function dec2bin(d, n)
implicit none
integer,intent(in) :: d
integer,intent(in),optional :: n
character(len=:),allocatable :: dec2bin
character(len=53) :: tmp
integer :: n_
character(len=8) :: f
if (present(n)) then
n_ = min(n, 53)
write(f,'(i2)') n_
f = '(B' // trim(adjustl(f)) // '.' // trim(adjustl(f)) // ')'
else
f = '(B53)'
endif
write(tmp,f) d
dec2bin = trim(adjustl(tmp))
end function
请注意,此函数不检查符号(因为正确处理了符号)。如果要将其限制为正整数,则需要在函数之外进行。
仅仅因为我必须自己寻找正确的语法,以下是 Fortran 2008 Standard, Cl 中的相关部分。 10.7.2.4“B、O、Z编辑”:
1 Bw 、 Bw .m 、 Ow 、 Ow .m 、 Zw 、 Zw .m 编辑描述符表示要编辑的字段占用 w 位置,除非 w 为零。当 w 为零时,处理器选择字段宽度。在输入时,w 不应是 零。对应的输入/输出列表项的类型应为整数、实数或复数。
[...]
6 Bw .m、Ow .m 和 Zw .m 编辑描述符的输出字段与 Bw、Ow 和 Zw 编辑描述符的输出字段相同,除了数字字符串或十六进制数字字符串由至少 m 个数字组成。如有必要,足够 包括前导零以达到最少 m 位。 m 的值不得超过 w 的值, 除非 w 为零。 [...]
【讨论】: