fortran66のブログ

fortran について書きます。

Fortran2018 の 16 進フォーマット

Hexadecimal Format

J.Reid の The New Features of Fortran 2018 中の Hexadecimal input/output を intel fortran 19.1 の beta 版で試してみます。出力は文中の possible output と少し違って、桁がずれて出力されました。

N2145 wg5-fortran.org

16 進数浮動小数点用フォーマットといえば、昔の IBM360 のものが有名ですが、なぜ今頃これが導入されるのかよく分かりません。

ソース・プログラム

とりあえず二進表記にして、4桁づつまとめて 16 進数にすれば対応がつかめます。

    program Console3
        implicit none

        print *, 1.375, '= 1.0 + 0.25 + 0.125 = 1+1/4+1/8 = 1.0110 = 0X1.6'
        print *, int(b'10110')/16.0 
        print '(a, ex0.1)', '   1.375 = ', 1.375  
        print *
!
        print *, -15.625, '= -(15.0 + 0.5 + 0.125 = 15+1/2+1/8) = -1111.1010 = -0XF.A' 
        print *, -int(b'11111010000000000')/16.0**3/2
        print '(a, ex14.4e3)', '  -15.625 = ', -15.625
        print *
!
        print *, 1048580.0, '= 16^4 + 4 = 1 0000 0000 0000 0000 0100 = 1000.0000 0000 0000 0010*2^17 = 8.0002P17'
        print *, b'100000000000000000100'
        print '(a, ex0.0)', '   1048580.0 = ', 1048580.0
        
    end program Console3

出力結果

Reid の与えた possible output は小数点位置を常に 1.xxx の形に位取りしていますが、intel fortran は 4 ビット分の 15 以下の数で位取りしているようです。

   1.375000     = 1.0 + 0.25 + 0.125 = 1+1/4+1/8 = 1.0110 = 0X1.6
   1.375000
   1.375 = 0XB.0P-3

  -15.62500     = -(15.0 + 0.5 + 0.125 = 15+1/2+1/8) = -1111.1010 = -0XF.A
  -15.62500
  -15.625 = -0XF.A000P+000

   1048580.
 = 16^4 + 4 = 1 0000 0000 0000 0000 0100 = 1000.0000 0000 0000 0010*2^17 = 8.0002P17
     1048580
   1048580.0 = 0X8.0002P+17

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)