Re: [问题] 新手问题:十进制转二进制再用二进制转回

楼主: blc (Anemos)   2023-03-21 04:11:44
我还真不知道能这样输出成二进制的样子,学到了
先讲一下,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
: 万分感谢解惑
:
作者: chunyu (sailor 知)   2023-03-22 17:27:00
太感谢了,我在好研究一下。我目前学的是Fortran90
楼主: blc (Anemos)   2023-03-22 19:23:00
90的话最好用free format,要跟77的fixed format区别一下
作者: glo6e (ezdodance)   2023-12-25 22:50:00

Links booklink

Contact Us: admin [ a t ] ucptt.com