読者です 読者をやめる 読者になる 読者になる

fortran66のブログ

fortran について書きます。

浮動小数フォーマット

かつてはハードウェア毎に浮動小数フォーマットが異なっていて、汎用性のある数値計算プログラムを作るのが困難でした。Fortran90ではそのような問題を解決するために、浮動小数に関する情報を得るための命令がたくさん用意されました。もっともFortran90が普及する頃には、浮動小数もIEEE754にほぼ統一されてしまい、それらの命令が活用されることはあまりありませんでした。

ここでは、メモ帳代わりに各種フォーマットをメモしておきます。
\pm f\times\beta^m
f は仮数部、β進表現で
f={c_1\over\beta}+{c_2\over\beta^2}+\dots+{c_n\over\beta^t}
[tex:0

Computer \beta t L U \epsilon_M=\beta^{1-t}
IEEE754(single) 2 23 -126 127 1.19\times10^{-7}
IEEE754(double) 2 52 -1022 1023 2.22\times10^{-16}
IEEE754(quadruple) 2 112 -16382 16383 1.93\times10^{-34}
Computer \beta t L U
NEC SX(float0);IEEE 2 52 -1022 1023
NEC SX(float1);IBM 2 56 -64 63
NEC SX(float2);CRAY 2 48 -16384 16383

(from SENAC Vol.30-4,1997)

Computer \beta t L U \epsilon_M=\beta^{1-t}
Univac 1108 2 27 -128 127 1.49\times10^{-8}
Honeywell 6000 2 27 -128 127 1.49\times10^{-8}
PDP-11 2 24 -128 127 1.19\times10^{-7}
Control Data 6600 2 48 -976 1070 7.11\times10^{-15}
Cray-1 2 48 -16384 8191 7.11\times10^{-15}
Illiac-IV 2 48 -16384 16383 7.11\times10^{-15}
Stun(Russian) 3 18 ? ? 7.74\times10^{-9}
Burroughs B5500 8 13 -51 77 1.46\times10^{-11}
Hewlett Packard HP-45 10 10 -98 100 1.00\times10^{-9}
Texas Instruments SR-5x 10 12 -98 100 1.00\times10^{-11}
IBM360 and 370 16 6 -64 63 9.54\times10^{-7}
IBM360 and 370 16 14 -64 63 2.22\times10^{-16}
Telefunken TR440 16 9{1\over2} -127 127 5.84\times10^{-11}
Maniac II 65536 2{11\over16} -7 7 7.25\times10^{-9}

(from G.E.Forsythe, M.A.Malcolm and C.B.Moler, Computer methods for mathematical computations, 1977)

Intel Fortran (IEEE754) x=s\times b^e\times\sum_{k=1}^pf_k\times b^{-k}

Computer \beta p e_{\rm min} e_{\rm max}
real(4) 2 24 -125 128
real(8) 2 53 -1021 1024
real(16) 2 113 -16381 16384

(from Intel Fortran User Reference Guide)

ソースコード

    program Console5
      implicit none
      integer, parameter :: ks = 4, kd = 8, kq = 16
      real(ks) :: s
      real(kd) :: d
      real(kq) :: q
      print *, 'Radix        b', radix(s)
      print *, 'Digits       t', digits(s)
      print *, 'Min Exponent L', minexponent(s)
      print *, 'Max Exponent U', maxexponent(s)
      print *, 'Epsilon       ', epsilon(s)
      print *
!
      print *, 'Radix        b', radix(d)
      print *, 'Digits       t', digits(d)
      print *, 'Min Exponent L', minexponent(d)
      print *, 'Max Exponent U', maxexponent(d)
      print *, 'Epsilon       ', epsilon(d)
      print *
!
      print *, 'Radix        b', radix(q)
      print *, 'Digits       t', digits(q)
      print *, 'Min Exponent L', minexponent(q)
      print *, 'Max Exponent U', maxexponent(q)
      print *, 'Epsilon       ', epsilon(q)
      stop
    end program Console5

実行結果

L,Uの定義が本文と違っていたけど仕方ないね。脳内で変換してみてね。

Radix b 2
Digits t 24
Min Exponent L -125
Max Exponent U 128
Epsilon 1.1920929E-07

Radix b 2
Digits t 53
Min Exponent L -1021
Max Exponent U 1024
Epsilon 2.220446049250313E-016

Radix b 2
Digits t 113
Min Exponent L -16381
Max Exponent U 16384
Epsilon 1.925929944387235853055977942584927E-0034
続行するには何かキーを押してください . . .