作者blc (Anemos)
看板Fortran
标题Re: [问题] 新手问题:十进位转二进位再用二进位转回
时间Tue Mar 21 04:11:44 2023
我还真不知道能这样输出成二进位的样子,学到了
先讲一下,B32.6不是小数点第6位,是不到6位的话补0的意思,
不过在目前的输出都超过6位的话就没影响
假设你是想比较浮点数的精确度,可能要先弄清楚一些概念,
1. 浮点数(Fortran里叫real)在电脑里是用二进位储存
存下的值就是你 write B32 出来的样子
2. 要比较不同数值的存法可以把输出的二进位用字串存,改字串比较容易
3. 字串可以再 read 回浮点数比较变化
下面是比较的程式,77的写法记得先空7格
program test_real
implicit none
real*4 pi, pi_after
character*32 pi_str
pi = 3.1415
! 转成二进位,用字串存
write(pi_str,'(B32)')pi
! 印出来
write(*,*)'pi in bin: ',pi_str
! 最後一位0改成1
pi_str(32:32) = '1'
! 印修改过的二进位
write(*,*)'pi in bin: ',pi_str
! 转回浮点数
read(pi_str,'(B32)')pi_after
! 印出来
write(*,*)'original pi = ',pi
write(*,*)'modified pi = ',pi_after
end
※ 引述《chunyu (sailor 知)》之铭言:
: 小弟第一次接触Fortran,先前完全没有其他程式语言基础,想请问各位神大
: 假设两个数值分别是 k1=3.1415和 k2=2.71828 ,怎麽转成二进位(取到小数第6位)再转回十进位,并计算其值与原值的差?
: IMPLICIT NONE
: Real*4 k1, k2
: k1=3.1415
: k2=2.71828
: WRITE(*,'("Binary -> ", 2B32.6)') k1, k2
: OPEN(unit=20, file='FT_01031201_EX04_2.out')
: WRITE(20,'("Binary -> ", 2B32.6)') k1, k2
: 只会写到这里
: 从下面开始,改怎麽利用刚刚算的二进位值再转十进位?
: WRITE(*,'("Output the data")')
: 50 FORMAT('Output the data')
: WRITE(20,50) 'Integer -> ', 2I32.6 ,k1, k2
: CLOSE(20)
: END
: 万分感谢解惑
: -----
: Sent from JPTT on my iPad
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 46.15.235.12 (挪威)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Fortran/M.1679343108.A.0CE.html
1F:推 chunyu: 太感谢了,我在好研究一下。我目前学的是Fortran90 03/22 17:27
2F:→ blc: 90的话最好用free format,要跟77的fixed format区别一下 03/22 19:23
3F:→ glo6e: 推 12/25 22:50