Re: [問題] 新手問題:十進位轉二進位再用二進位轉回

看板Fortran作者 (Anemos)時間1年前 (2023/03/21 04:11), 編輯推噓1(102)
留言3則, 3人參與, 11月前最新討論串2/2 (看更多)
我還真不知道能這樣輸出成二進位的樣子,學到了 先講一下,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://www.ptt.cc/bbs/Fortran/M.1679343108.A.0CE.html

03/22 17:27, 1年前 , 1F
太感謝了,我在好研究一下。我目前學的是Fortran90
03/22 17:27, 1F

03/22 19:23, 1年前 , 2F
90的話最好用free format,要跟77的fixed format區別一下
03/22 19:23, 2F

12/25 22:50, 11月前 , 3F
12/25 22:50, 3F
文章代碼(AID): #1a6Bu43E (Fortran)
文章代碼(AID): #1a6Bu43E (Fortran)