16進 浮動小数点数(現在IBMではHFPと呼ばれている)は、 IBM System/360コンピュータで初めて導入された浮動小数点数をエンコードするための形式であり、そのアーキテクチャに基づく後続のマシン[1] [2] [3]や、System/360とアプリケーション互換性があることを意図したマシンでもサポートされています。 [4] [5]
IEEE 754浮動小数点と比較すると、HFP 形式は仮数部が長く、指数部が短くなっています。すべての HFP 形式には、バイアスが 64 の 7 ビットの指数部があります。表現可能な数値の正規化された範囲は、16 −65から 16 63 (約 5.39761 × 10 −79から 7.237005 × 10 75 ) です。
この数値は次の式で表されます: (−1)符号× 0.仮数× 16指数−64。
単精度32ビット
単精度HFP数値(IBM では「short」と呼ばれます) は、32 ビット ワードに格納されます。
この形式では、最初のビットは抑制されず、基数 (16 進数) ポイントは仮数 (IBM ドキュメントおよび図では小数) の左側に設定されます。
基数が 16 であるため、この形式の指数は IEEE 754 の同等の指数の約 2 倍の大きさになります。バイナリで同様の指数範囲を実現するには、9 ビットの指数が必要になります。
例
値 -118.625 を HFP 単精度浮動小数点値としてエンコードすることを検討してください。
値は負なので、符号ビットは 1 です。
118.625 10の値は、2 進数では 1110110.101 2です。この値は、左端の桁が 0 になるまで、基数点を一度に 4 ビット (16 進数の 1 桁) ずつ左に移動して正規化され、0.01110110101 2になります。残りの右端の桁には 0 が埋め込まれ、24 ビットの小数部は .0111 0110 1010 0000 0000 0000 2になります。
正規化された値は基数点を 16 進数で 2 桁左に移動して、乗数と指数が 16 +2になります。指数 (+2) にバイアス +64 が加算されて +66 になり、100 0010 2になります。
符号、指数とバイアス、正規化された分数を組み合わせると、次のエンコードが生成されます。
つまり、表される数は −0.76A000 16 × 16 66 − 64 = −0.4633789… × 16 +2 = −118.625 となります。
表現可能な最大の数
表現される数は +0.FFFFFF 16 × 16 127 − 64 = (1 − 16 −6 ) × 16 63 ≈ +7.2370051 × 10 75である。
最小の正の正規化数
表される数値は +0.1 16 × 16 0 − 64 = 16 −1 × 16 −64 ≈ +5.397605 × 10 −79です。
ゼロ
ゼロ (0.0) は、正規化された形式ではすべてゼロのビットとして表され、算術的には +0.0 16 × 16 0 − 64 = +0 × 16 −64 ≈ +0.000000 × 10 −79 = 0 という値になります。すべてのビットがゼロの小数部が与えられた場合、正または負の符号ビットと非ゼロのバイアス指数の任意の組み合わせは、算術的にゼロに等しい値を生成します。ただし、CPU ハードウェアによって生成されるゼロの正規化された形式は、すべてのビットがゼロです。これは、3 つの浮動小数点精度形式すべてに当てはまります。他の指数値との加算または減算では、結果の精度が失われる可能性があります。
精度の問題
基数は 16 なので、2 進数の仮数部には最大 3 ビットのゼロが付く可能性があります。つまり、数値を 2 進数に変換すると、精度は 21 ビットしかなくなる可能性があります。「精度のゆらぎ」効果により、一部の計算が非常に不正確になる可能性があります。これはかなりの批判を引き起こしました。[6]
不正確さの良い例は、10 進数値 0.1 の表現です。これは、正確な 2 進数または 16 進数表現がありません。16 進数形式では、0.19999999... 16または 0.0001 1001 1001 1001 1001 1001... 2と表現されます。つまり 、次のようになります。
これには 21 ビットしかありませんが、バイナリ バージョンには 24 ビットの精度があります。
6 桁の 16 進精度は、6 桁の 10 進精度とほぼ同等です (つまり、(6 − 1) log 10 (16) ≈ 6.02)。単精度の 16 進浮動小数点数を 10 進文字列に変換する場合、同じ 16 進浮動小数点値に戻すには、少なくとも 9 桁の有効桁 (つまり、6 log 10 (16) + 1 ≈ 8.22) が必要になります。
倍精度64ビット
倍精度HFP形式(IBM では「long」と呼ばれます) は、小数フィールドが広く、倍精度数がダブルワード (8 バイト) に格納されることを除いて、「short」形式と同じです。
この形式の指数は、対応する IEEE バイナリ形式の範囲の約 4 分の 1 のみをカバーします。
16 進数の 14 桁の精度は、10 進数の 17 桁にほぼ相当します。倍精度の 16 進浮動小数点数を 10 進文字列に変換する場合、同じ 16 進浮動小数点値に戻すには、少なくとも 18 桁の有効桁数が必要です。
拡張精度128ビット
IBM によって拡張精度と呼ばれる4 倍精度HFP 形式は、System/370 シリーズに追加され、一部の S/360 モデル (S/360-85、-195、および特別な要求または OS ソフトウェアによってシミュレートされたその他のモデル) で使用できるようになりました。拡張精度小数フィールドはより広く、拡張精度の数値は 2 つのダブル ワード (16 バイト) として格納されます。
28 桁の 16 進精度は、32 桁の 10 進精度にほぼ相当します。拡張精度 HFP を 10 進文字列に変換する場合、同じ HFP 値に戻すには少なくとも 35 桁の有効桁数が必要です。下位部分に格納される指数は、0 未満でない限り、上位部分より 14 小さくなります。
算術演算
使用可能な算術演算は、正規化および非正規化の両方の加算と減算、および比較です。事前正規化は指数差に基づいて行われます。乗算と除算は、非正規化値を事前正規化し、1つのガード桁の後に結果を切り捨てます。2で割る操作を簡素化するために、半分にする操作があります。ESA/390以降では、平方根演算があります。すべての操作には、精度の低下を避けるために1つの16進数のガード桁があります。ほとんどの算術演算は、単純なポケット電卓のように切り捨てられます。したがって、1 − 16 −8 = 1です。この場合、結果はゼロから離れた方向に丸められます。[7]
IBM メインフレーム上の IEEE 754
1998年のS/390 G5から[8] 、 IBMメインフレームにはIEEE 754浮動小数点演算標準に準拠したIEEE232進浮動小数点ユニットも搭載されるようになりました。IEEE10進浮動小数点演算は2007年にミリコード[10]を使用してIBM System z9 GA2 [9]に追加され、2008年にはIBM System z10にハードウェアで追加されました。[11]
現代のIBMメインフレームは、3つの16進数(HFP)形式、3つの2進数(BFP)形式、および3つの10進数(DFP)形式の3つの浮動小数点基数をサポートしています。コアごとに2つの浮動小数点ユニットがあり、1つはHFPとBFPをサポートし、もう1つはDFPをサポートしています。レジスタファイルは1つ(FPR)で、3つの形式がすべて保持されます。 2015年のz13以降、プロセッサには、それぞれ128ビット幅の32個のベクトルレジスタを含むベクトル機能が追加されました。ベクトルレジスタには、2つの64ビット浮動小数点数または4つの32ビット浮動小数点数を含めることができます。[12] 従来の16個の浮動小数点レジスタは新しいベクトルレジスタにオーバーレイされるため、一部のデータは従来の浮動小数点命令または新しいベクトル命令で操作できます。
特別な用途
IBM HFP 形式は次の場合に使用されます。
- 食品医薬品局(FDA)が新薬申請(NDA)研究提出に要求するSAS 5トランスポートファイル(.XPT)[13]
- 気象予測モデルの出力を交換するためのGRIB (GRIDded Binary)データファイル(現在のバージョンではIEEE単精度浮動小数点形式)
- GDS II (Graphic Database System II) 形式のファイル ( OASISが代替)、および
- SEG Y(Society of Exploration Geophysicists Y)形式のファイル(IEEE単精度浮動小数点が2002年にこの形式に追加されました)。[14]
IBM は HFP 形式を使用するハードウェアの唯一の残存プロバイダーであり、この形式をサポートする IBM マシンはメインフレームのみであるため、この形式を必要とするファイル形式はほとんどありません。例外は 1 つあり、FDA が要求する SAS 5 トランスポート ファイル形式です。この形式では、「ファイル内のすべての浮動小数点数は、IBM メインフレーム表現を使用して保存されます。[...] ほとんどのプラットフォームは、浮動小数点数に IEEE 表現を使用します。[...] トランスポート ファイルの読み取りおよび/または書き込みを支援するために、IEEE 表現 (ビッグ エンディアンまたはリトル エンディアン) からトランスポート表現に変換し、またその逆に変換するルーチンを提供しています。」[13] IBM 形式のコードもLGPLv2.1の下で利用可能です。[15]
IBM浮動小数点形式を使用するシステム
- IBM System/360および後継機種
- RCA スペクトラ 70
- 英語電気システム4
- GEC 4000 シリーズミニコンピュータ
- Interdata 16 ビットおよび 32 ビット コンピュータ
- SDSシグマシリーズ
- データジェネラルミニコンピュータ
- ICL 2900 シリーズコンピュータ
- シーメンス7.700 および 7.500 シリーズ メインフレームと後継機
16進浮動小数点の決定
「IBM System/360 のアーキテクチャ」という記事では、この選択の理由として、「この選択により、浮動小数点加算時のプリシフト、オーバーフロー、およびポストシフトの精度損失の頻度が大幅に減少する」と説明されています。[16]これにより、大規模な System/360 モデルのパフォーマンスが向上し、小規模なモデルではコストが削減されました。著者は精度損失の可能性を認識していましたが、64 ビット浮動小数点変数ではこれが重要ではないと想定していました。残念ながら、設計者はベンフォードの法則を認識していなかったようです。ベンフォードの法則とは、数値の大部分の精度が低下することを意味します。
System/360 のアーキテクト 2 名が執筆した「Computer Architecture」という本には、1958 年から 1965 年にかけての Sweeney の研究が引用されている。この研究では、2 より大きい基数を使用すると、整列と正規化に必要なシフト数、特に必要な異なるシフト数が大幅に減少することが示された。実装を高速化するために、より大きな基数を使用した。8 ビット バイトを考えると、基数 16 を選択するのは当然だった。32 ビット浮動小数点は丸め誤差が広がらない計算にのみ使用され、64 ビット倍精度はすべての科学計算と工学計算に使用されるという意図があった。倍精度の最初の実装では、適切な丸めを可能にするガード桁がなかったが、これは最初の顧客への納品後すぐに変更された。[17]
参照
参考文献
- ^ IBM System/360 操作原理、IBM 出版物 A22-6821-6、第 7 版 (1967 年 1 月 13 日)、pp.41-50
- ^ IBM System/370 動作原理、IBM 出版物 GA22-7000-4、第 5 版 (1975 年 9 月 1 日)、pp.157-170
- ^ z/Architecture Principles of Operation、IBM Publication SA22-7832-01、第 2 版 (2001 年 10 月)、第 9 章以降。
- ^ Xerox Data Systems (1973年10月). Xerox SIGMA 7 Computer Reference Manyal. p. 48 . 2020年11月13日閲覧。
- ^ RCA (1966年3月). Spectra 70プロセッサ: 35 45 55 (PDF) . p. 184 . 2020年11月13日閲覧。
- ^ Warren Jr.、Henry S. (2013) [2002]。「先頭桁の分布」。Hacker 's Delight (第2版)。Addison Wesley - Pearson Education、Inc。pp . 385–387。ISBN 978-0-321-84268-80-321-84268-5。
- ^ ESA/390 拡張浮動小数点サポート: 概要
- ^ Schwarz, EM; Krygowski, CA (1999 年 9 月). 「S/390 G5 浮動小数点ユニット」. IBM Journal of Research and Development . 43 (5.6): 707–721. doi :10.1147/rd.435.0707.
- ^ Duale, AY; Decker, MH; Zipperer, H.-G.; Aharoni, M.; Bohizic, TJ (2007 年 1 月)。「z9 の 10 進浮動小数点: 実装とテストの観点」。IBM Journal of Research and Development。51 ( 1.2): 217–227。CiteSeerX 10.1.1.123.9055。doi :10.1147/rd.511.0217。
- ^ Heller, LC; Farrell, MS (2004 年 5 月). 「IBM zSeries プロセッサのミリコード」. IBM Journal of Research and Development . 48 (3.4): 425–434. CiteSeerX 10.1.1.641.1164 . doi :10.1147/rd.483.0425.
- ^ Schwarz, EM; Kapernick, JS; Cowlishaw, MF (2009 年 1 月)。「IBM System z10 プロセッサーでの 10進浮動小数点サポート」。IBM Journal of Research and Development。53 ( 1): 4:1–4:10。doi : 10.1147/JRD.2009.5388585。
- ^ z/アーキテクチャの動作原理
- ^ ab 「SAS トランスポート (XPORT) 形式のデータ セットのレコード レイアウト」(PDF) 。2014 年9 月 18 日閲覧。
- ^ 「SEG Y rev 1 データ交換フォーマット、リリース 1.0」(PDF)。2002 年 5 月。
- ^ 「パッケージ 'SASxport'」(PDF) 。2020年3月10日。 2016年8月18日時点のオリジナル(PDF)からアーカイブ。 2016年7月19日閲覧。
- ^ Amdahl, Gene; Blaauw, Gerrit; Brooks, Jr, Frederick. 「IBM System/360 のアーキテクチャ」。IBM Journal of Research and Development。1964 : 87。2023年9 月 4 日に閲覧。
- ^ Blaauw, Gerrit A.; Brooks, Frederick P. (1997).コンピュータアーキテクチャ(第 1 版). マサチューセッツ州レディング: Addison-Weslet. ISBN 0-201-10557-8。
さらに読む
- Sweeney, DW (1965). 「浮動小数点加算の分析」IBM Systems Journal . 4 (1): 31–42. doi :10.1147/sj.41.0031.
- Tomayko, J. (1995 年夏)。「System 360浮動小数点問題」。IEEE Annals of the History of Computing。17 (2): 62–63。doi :10.1109/MAHC.1995.10006。ISSN 1058-6180 。
- Harding, LJ (1966)、「System/360 浮動小数点の特異性」、SHARE 27 の議事録、1966 年 8 月 8 ~ 12 日、SHARE XXVII で発表、カナダ、トロント doi:10.5281/zenodo.10566524。
- Harding, LJ (1966)、「System/360 浮動小数点の修正」、SHARE 27 の議事録、1966 年 8 月 8 ~ 12 日、SHARE XXVII で発表、カナダ、トロント doi:10.5281/zenodo.10566780。
- Harding, LJ (1966)、「浮動小数点乗算の修正案」、 IBM 社へのエンジニアリング変更案、doi:10.5281/zenodo.10567044。
- アンダーソン、スタンレー F.、アール、ジョン G.、ゴールドシュミット、ロバート エリオット、パワーズ、ドン M. (1967 年 1 月)。「IBM System/360 モデル 91: 浮動小数点実行ユニット」。IBM研究開発ジャーナル。11 (1): 34–53。doi :10.1147/rd.111.0034。
- Padegs, A. (1968). 「System/360 モデル 85 の構造的側面、III: 浮動小数点アーキテクチャの拡張」IBM Systems Journal . 7 (1): 22–29. doi :10.1147/sj.71.0022.
- Schwarz , EM; Sigal, L.; McPherson , TJ (1997 年 7 月)。「S/390 Parallel Enterprise Server G4 用 CMOS 浮動小数点ユニット」。IBM Journal of Research and Development。41 (4.5): 475–488。doi :10.1147/rd.414.0475。
