本帖最后由 vvt 于 2022-5-4 22:11 编辑
实际上,后面是用0填充的,但是它是二进制的 0 填充,输出时转换成10进制,就不是0了。
对于这个问题,首先你要知道。单精度的 x = 3.14159,实际上就不是准确的 3.14159,而是 3.14159011840820...... 请理解,浮点数均有误差,而单精度只有6-7位有效数字(严格说约6.9位)
对比一个例子,假如有个文明使用三进制,它们的 0.1(1/3) 表示成十进制就是 0.3333333...
如果我们增大有效位数,变成 0.333333300000000,再转换成三进制,是不是就出现不整位数了?
对于计算机来说,要实现十进制的有效位数保留,效率比较低。大多数时候,我们选择输出时保留一定的位数。
对于你这样的要求,你有两种实现:
1. 你需要保留固定的小数位数,且数字不大。比如你要保留6位小数。
[Fortran] 纯文本查看 复制代码 real :: x
real(8) :: y
y = nint(1.d6*x)/1.d6
write(*,*) x, y
2. 你要保留固定的有效位数。比如保留7位有效数字。借鉴楼上的方法。(请注意,单精度只有6.9位有效数字,所以你不能保留8位或更多有效数字)
[Fortran] 纯文本查看 复制代码 y=real4real8(x)
write(*,*) x, y
function real4real8(r4)result(r8)
real,intent(in)::r4
real(8)::r8
character(len=15)::str
write(str,"(ES13.6E2)")r4 !此处的 es13.6 的 6 为保留有效数字-1,即7-1=6
read(str,*)r8
end function real4real8
楼上写的es15.8,显然超过了单精度的有效数字。
|