かつてはハードウェア毎に浮動小数フォーマットが異なっていて、汎用性のある数値計算プログラムを作るのが困難でした。Fortran90ではそのような問題を解決するために、浮動小数に関する情報を得るための命令がたくさん用意されました。もっともFortran90が普及する頃には、浮動小数もIEEE754にほぼ統一されてしまい、それらの命令が活用されることはあまりありませんでした。
ここでは、メモ帳代わりに各種フォーマットをメモしておきます。
f は仮数部、β進表現で
[tex:0
Computer | t | L | U | ||
---|---|---|---|---|---|
IEEE754(single) | 2 | 23 | -126 | 127 | |
IEEE754(double) | 2 | 52 | -1022 | 1023 | |
IEEE754(quadruple) | 2 | 112 | -16382 | 16383 |
Computer | 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 | t | L | U | ||
---|---|---|---|---|---|
Univac 1108 | 2 | 27 | -128 | 127 | |
Honeywell 6000 | 2 | 27 | -128 | 127 | |
PDP-11 | 2 | 24 | -128 | 127 | |
Control Data 6600 | 2 | 48 | -976 | 1070 | |
Cray-1 | 2 | 48 | -16384 | 8191 | |
Illiac-IV | 2 | 48 | -16384 | 16383 | |
Stun(Russian) | 3 | 18 | ? | ? | |
Burroughs B5500 | 8 | 13 | -51 | 77 | |
Hewlett Packard HP-45 | 10 | 10 | -98 | 100 | |
Texas Instruments SR-5x | 10 | 12 | -98 | 100 | |
IBM360 and 370 | 16 | 6 | -64 | 63 | |
IBM360 and 370 | 16 | 14 | -64 | 63 | |
Telefunken TR440 | 16 | -127 | 127 | ||
Maniac II | 65536 | -7 | 7 |
(from G.E.Forsythe, M.A.Malcolm and C.B.Moler, Computer methods for mathematical computations, 1977)
Computer | ||||
---|---|---|---|---|
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-07Radix b 2
Digits t 53
Min Exponent L -1021
Max Exponent U 1024
Epsilon 2.220446049250313E-016Radix b 2
Digits t 113
Min Exponent L -16381
Max Exponent U 16384
Epsilon 1.925929944387235853055977942584927E-0034
続行するには何かキーを押してください . . .