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