コンピューティングにおいて、4倍精度(またはクワッド精度)は、53ビット倍精度の少なくとも2倍の精度で16バイト( 128ビット)を占めるバイナリ浮動小数点ベースのコンピュータ数値フォーマットです。
この 128 ビットの 4 倍精度は、倍精度を超える結果を必要とするアプリケーション向けに設計されており、[ 1 ]中間計算やスクラッチ変数でのオーバーフローや丸め誤差を最小限に抑えることで、倍精度の結果をより信頼性高く正確に計算できるようにすることを主な機能としています。オリジナルの IEEE 754 浮動小数点標準の主要設計者であるWilliam Kahan氏は、「今のところ、10 バイトの拡張フォーマットは、超高精度の算術演算の価値と、それを高速に実行するための実装コストとの間の許容できる妥協点です。まもなく、さらに 2 バイトの精度が許容できるようになり、最終的には 16 バイトのフォーマットになるでしょう… より広い精度へのこのような段階的な進化は、浮動小数点演算の IEEE 標準 754 が策定された時点ですでに想定されていました。」と述べています。[ 2 ]
IEEE 754-2008では、128ビットの2進数形式は正式にbinary128と呼ばれています。
IEEE 754規格では、バイナリ128は以下のように定義されています。
符号ビットは数値の符号を決定します(この数値がゼロの場合も符号付きです)。「1」は負を表します。
これにより、33~36桁の有効小数点の精度が得られます。最大33桁の有効小数点数を持つ小数文字列をIEEE 754四倍精度形式に変換して通常の数値にし、その後同じ桁数の小数文字列に再変換した場合、最終結果は元の文字列と一致するはずです。IEEE 754四倍精度の数値を少なくとも36桁の有効小数点数を持つ小数文字列に変換し、その後四倍精度表現に再変換した場合、最終結果は元の数値と一致する必要があります。[ 3 ]
指数部がすべてゼロで格納されていない限り(非正規数とゼロをエンコードするために使用)、先頭ビットは暗黙的に値1で書き込まれます。したがって、メモリ形式には仮数の112ビットしか表示されませんが、正規値の場合、全体の精度は113ビット(約34桁の10進数: log 10 (2 113 ) ≈ 34.016)です。非正規数の場合、最小の非ゼロ値まで精度が徐々に低下し、1ビットになります。ビットの配置は次のようになります。
![]()
4倍精度バイナリ浮動小数点指数は、オフセットバイナリ表現を使用してエンコードされ、ゼロオフセットは16383です。これは、IEEE 754規格では指数バイアスとしても知られています。
したがって、オフセットバイナリ表現で定義されているように、真の指数を取得するには、格納されている指数からオフセット16383を減算する必要があります。
格納されている指数0000 16と7FFF 16は特別に解釈されます。
最小の厳密に正の値 (非正規値) は 2 −16494 ≈ 10 −4965で、精度は 1 ビットのみです。最小の正の正規値は 2 −16382 ≈ 3.3621 × 10 −4932で、精度は 113 ビット、つまり ±2 −16494です。表現可能な最大値は2 16384 − 2 16271 ≈ 1.1897 × 10 4932です。
これらの例は、浮動小数点値をビット表現(16進数)で示したものです。これには、符号、(バイアス付き)指数部、および仮数部が含まれます。
デフォルトでは、仮数のビット数が奇数であるため、1/3 は倍精度のように切り捨てられます。したがって、丸めポイントより後のビットは となり、最後の桁では0101…1/2 未満になります。
倍精度値のペアを使用してほぼ4倍精度を実現する一般的なソフトウェア技術は、ダブルダブル演算と呼ばれることがあります。[ 4 ] [ 5 ] [ 6 ] 53ビットの仮数部を持つIEEE倍精度値のペアを使用すると、ダブルダブル演算は、少なくとも[ 4 ] 2×53=106ビット(実際には、指数範囲が限られているため、一部の最大値を除いて107ビット[ 7 ])の仮数部を持つ数値に対する演算を提供し、IEEEバイナリ1284倍精度の113ビットの仮数部よりもわずかに精度が低いだけです。倍精度浮動小数点数の範囲は、指数が依然として 11 ビットであるため、倍精度浮動小数点数形式と基本的に同じままです[ 4 ] 。これは、 IEEE 4 倍精度浮動小数点数の 15 ビット指数よりも大幅に小さい値です (倍精度浮動小数点数の範囲は1.8 × 10 308 、バイナリ 128の範囲は1.2 × 10 4932 )。
特に、double-double 手法におけるdouble-double/quadruple-precision 値q は、2 つの double-precision 値xとyの和q = x + yとして暗黙的に表現され、それぞれの double-double 値はqの半分を提供します。の仮数。[ 5 ]つまり、( x , y )のペアがqの代わりに格納され、qの値に対する演算(+、−、×、…)は、 xとyの値に対する同等の (ただしより複雑な) 演算に変換されます。したがって、この手法の算術演算は、倍精度演算のシーケンスに還元されます。倍精度演算は一般的にハードウェアで実装されているため、倍精度演算は通常、より一般的な任意精度演算手法よりも大幅に高速です。[ 4 ] [ 5 ]
ダブルダブル演算には次の特別な特徴があることに注意してください: [ 8 ]
倍精度浮動小数点演算に加えて、より高い精度が必要な場合は、高精度浮動小数点ライブラリを使用せずに、三重倍精度または四重倍精度演算を生成することもできます。これらはそれぞれ、3つ(または4つ)の倍精度値の和として表されます。それぞれ少なくとも159/161ビットおよび212/215ビットの演算を表すことができます。任意の数の項への自然な拡張(ただし指数範囲によって制限される)は、浮動小数点展開と呼ばれます。
同様の手法を用いて、2つの4倍精度値の和として表されるダブルクワッド演算を生成することができる。これらは少なくとも226ビット(または227ビット)の演算を表すことができる。 [ 9 ]
4倍精度は、ソフトウェアではさまざまな手法(上記のdouble-double手法など。ただし、この手法はIEEE 4倍精度を実装するものではない)によって実装されることが多い。なぜなら、2016年現在、4倍精度に対するハードウェアの直接的なサポートは(あまり一般的ではない)(下記の「ハードウェアサポート」を参照)。汎用任意精度演算ライブラリを使用すれば4倍精度(またはそれ以上)を実現できますが、専用の4倍精度実装の方がより高いパフォーマンスを発揮する場合があります。
別の問題として、4倍精度型がコンピュータプログラミング言語にどの程度直接的に組み込まれているかという点がある。
Fortranでは、4 倍精度はreal(real128)(iso_fortran_envFortran 2008 のモジュールを使用する必要があり、定数はreal128ほとんどのプロセッサで 16 に等しい)またはreal(selected_real_kind(33, 4931))、あるいは非標準的な方法として で指定されます。(例えば、 Intel Fortran コンパイラ[ 10 ]や、 x86、x86-64、およびItaniumアーキテクチャ上のGNU Fortranコンパイラ[ 11 ]では、 REAL*164 倍精度REAL*16がサポートされています。)
C プログラミング言語の場合、ISO/IEC TS 18661-3 (C の浮動小数点拡張、交換および拡張型)では_Float128、IEEE 754 四倍精度フォーマット (binary128) を実装する型として指定しています。[ 12 ]あるいは、一部のシステムとコンパイラでは、 C / C++で四倍精度をlong double型で指定できますが、これは言語で必須ではありません (long double少なくとも と同等の精度であることのみを要求double)。また、一般的でもありません。
C++23以降、C++言語は<stdfloat>固定幅浮動小数点型を含むヘッダーを定義しています。これらの実装は任意ですが、サポートされている場合はstd::float128_t4倍精度に対応します。
x86 および x86-64 では、最も一般的な C/C++ コンパイラはlong double、80 ビット拡張精度(例えば、GNU C コンパイラgcc [ 13 ]およびスイッチ付きのIntel C++ コンパイラ[ 14 ] ) または単に倍精度と同義 (例えば、Microsoft Visual C++ [ 15 ] ) として実装しており、4 倍精度としては実装していません。ARM 64 ビット アーキテクチャ(AArch64)のプロシージャ呼び出し標準では、IEEE 754 4 倍精度フォーマットに対応すると規定されています。[ 16 ]他のいくつかのアーキテクチャでは、一部の C/C++ コンパイラは、 PowerPC (double-double [ 17 ] [ 18 ] [ 19 ]およびSPARC [ 20 ]の gcc や SPARC の Sun Studio コンパイラのように、4 倍精度として実装しています。[ 21 ]が四倍精度でなくても、一部の C/C++ コンパイラは、拡張機能として非標準の四倍精度型を提供します。たとえば、gcc は、x86、x86-64、およびItanium CPU 用に と呼ばれる四倍精度型を提供し、[ 22 ] PowerPCでは-mfloat128-hardware または -mfloat128 オプションを使用して IEEE 128 ビット浮動小数点として提供されます。[ 23 ]また、x86 および x86-64 用の Intel の C/C++ コンパイラの一部のバージョンは、 と呼ばれる非標準の四倍精度型を提供します。[ 24 ]/Qlong‑doublelong doublelong doublelong double__float128_Quad
Zigは、その型によってそれをサポートしているf128。[ 25 ]
Google の開発中の言語Carbon は、と呼ばれる型でそれをサポートしているf128。[ 26 ]
2026年現在、Rustf128はIEEE 4倍精度128ビット浮動小数点数用の新しい型を追加する作業を進めている。 [ 27 ]
__float128と__complex128演算を提供します。__float128多倍長演算ライブラリ Boost.Multiprecision は、型と型のための統一されたクロスプラットフォーム C++ インターフェースを提供し_Quad、標準数学ライブラリのカスタム実装を含んでいます。[ 28 ]IBM System/390 G5 には 1998 年にIEEE 4 倍精度演算が追加され、 [ 32 ]その後のz/Architectureプロセッサではハードウェアでサポートされています。[ 33 ] [ 34 ] IBM POWER9 CPU ( Power ISA 3.0 ) はネイティブ 128 ビットのハードウェア サポートを備えています。[ 23 ]
PA-RISC 1.0 [ 35 ]、SPARC V8 [ 36 ]、V9 [ 37 ]アーキテクチャではIEEE 128ビット浮動小数点数のネイティブサポートが定義されています(例えば、16個の4倍精度レジスタ%q0、%q4、…があります)が、 2004年時点では、ハードウェアで4倍精度演算を実装しているSPARC CPUはありません。[ 38 ]
非IEEE拡張精度(128ビットの記憶領域、1ビットの符号ビット、7ビットの指数部、112ビットの仮数部、8ビットの未使用)は、IBM System/370シリーズ(1970年代~1980年代)に追加され、 1960年代には一部のSystem/360モデル(System/360-85、 [ 39 ] -195、その他は特別な要求またはOSソフトウェアによるシミュレーション)で利用可能でした。
シーメンスの7.700および7.500シリーズのメインフレームとその後継機種は、IBM System/360およびSystem/370と同じ浮動小数点フォーマットと命令セットをサポートしています。
VAXプロセッサは、IEEE規格に準拠しない4倍精度浮動小数点演算を「H浮動小数点」フォーマットとして実装しました。これは、1ビットの符号ビット、15ビットの指数部、112ビットの仮数部で構成されていましたが、メモリ上のレイアウトはIEEE規格の4倍精度浮動小数点演算とは大きく異なり、指数部のバイアスも異なっていました。初期のVAXプロセッサのうち、H浮動小数点演算命令をハードウェアで実装していたのはごく一部で、その他はすべてソフトウェアでH浮動小数点演算をエミュレートしていました。
NECベクトルエンジンアーキテクチャは、128 ビットバイナリ IEEE 754 4 倍精度数の加算、減算、乗算、比較をサポートしています。[ 40 ]隣接する 2 つの 64 ビットレジスタが使用されます。ベクトルレジスタでは 4 倍精度演算はサポートされていません。[ 41 ]
RISC -Vアーキテクチャは、128ビットバイナリIEEE 754-2008浮動小数点演算用の「Q」(4倍精度)拡張を規定しています。[ 42 ]「L」拡張(まだ認証されていません)は、64ビットおよび128ビット10進浮動小数点を規定します。[ 43 ]
4倍精度(128ビット)ハードウェア実装は、ストリーミングSIMD拡張機能やAltiVecなど、 SIMD命令を実装する「128ビットFPU」と混同してはならない。後者は、4つの32ビット単精度または2つの64ビット倍精度の値からなる128ビットベクトルを同時に演算するものである。
は、32ビット整数と32、64、128ビットのIEEE標準754浮動小数点を主なデータ型とする命令セットアーキテクチャ(ISA)です。
小数点: このアーキテクチャは、IEEE 754 互換の浮動小数点命令セットを提供し、32 個の単精度 (32 ビット)、32 個の倍精度 (64 ビット)、16 個の四倍精度 (128 ビット) レジスタ、またはそれらの組み合わせを提供する別のレジスタ ファイル上で動作します。
ただし、ハードウェアが浮動小数点命令を正常に完了しない状況が4つあります。…命令がハードウェアによって実装されていない(SPARC FPU 上の 4 倍精度命令など)。