Cおよび関連プログラミング言語では、は浮動小数点データ型long doubleを指します。このデータ型は倍精度よりも精度が高いことが多いですが、言語標準では と同等以上の精度が要求されています。C の他の浮動小数点型と同様に、必ずしもIEEE 形式にマップされるとは限りません。
double
long doubleC言語
歴史
このlong double型は1989年のオリジナルのC標準[1]に存在していましたが、 1999年のC標準改訂版、つまりC99によってサポートが改善され、標準ライブラリが拡張され、やlong doubleなどの関数が含まれるようになりました。
sinl()strtold()
long double 定数は、接尾辞 "L" または "l" (小文字の L) が付いた浮動小数点定数です。たとえば、4 倍精度の場合は 0.33333333333333333333333333333333L または 3.1415926535897932384626433832795029Lです。接尾辞がない場合、評価はFLT_EVAL_METHODに依存します。
実装
x86アーキテクチャでは、ほとんどのCコンパイラは、 C99 / C11標準(IEC 60559浮動小数点演算(付録F))で指定されているように、x86ハードウェアでサポートされている80ビット拡張精度型(データ構造のアラインメントを維持するために通常12バイトまたは16バイトとして格納されるlong double)として実装します。例外は、の同義語を作成するx86用のMicrosoft Visual C++です。[2] Microsoft Windows上のIntel C++コンパイラは拡張精度をサポートしていますが、ハードウェアの拡張精度形式に対応するために のスイッチが必要です。[3]long doubledouble/Qlong‑doublelong double
コンパイラはIEEE 754の4倍精度2進浮動小数点形式long double(binary128)を使用することもあります。これはHP-UX、[4] Solaris / SPARC、[5] 64ビットまたはn32 ABIのMIPS、[6] 64ビットARM(AArch64)[7](Linuxなどの標準AAPCS呼び出し規約を使用するオペレーティングシステム)、およびFLOAT(IEEE)[8] [9] [10]のz/OSに当てはまります。ほとんどの実装はソフトウェアですが、一部のプロセッサはハードウェアでサポートしています。
一部のPowerPCシステムでは、[11]は double-doublelong double演算として実装されており、値は2つの倍精度値の正確な合計とみなされ、少なくとも106ビットの精度が得られます。このような形式では、型はIEEE浮動小数点標準に準拠していません。それ以外の場合は、単に(倍精度)の同義語です。たとえば、32ビットARM、[12] 64ビットARM(AArch64)(Windows [13]およびmacOS [14])、および32ビットMIPS [15](古いABI、別名o32)などです。
long doublelong doublelong doubledouble
GNU C コンパイラでは、long double型に使用される物理ストレージ(96 ビットまたは 128 ビットのいずれか)に関係なく、x86 プロセッサ上では 80 ビットの拡張精度になります。[16]他のアーキテクチャでは、 はdouble-double ( PowerPCなど)[17] [18] [19])または 128 ビットの4 倍精度( SPARCなど)long doubleになります。 [20] gcc 4.3 以降では、4 倍精度も x86 でサポートされていますが、ではなく非標準の型としてサポートされています。[21]__float128long double
x86 アーキテクチャ、特にx86 上のx87浮動小数点命令は 80 ビット拡張精度演算をサポートしていますが、演算を自動的に倍精度 (または単精度) に丸めるようにプロセッサを構成することもできます。逆に、拡張精度モードでは、最終結果がより低い精度で格納される場合でも (つまり、FLT_EVAL_METHOD == 2 )、コンパイラが生成した中間計算に拡張精度を使用できます。Linux 上の gcc では、80 ビット拡張精度がデフォルトです。いくつかのBSDオペレーティングシステム ( FreeBSDおよびOpenBSD ) では、倍精度モードがデフォルトであり、演算は実質的に倍精度に縮小されます。[22] (ただし、 NetBSD 7.0 以降では、80 ビット拡張精度がデフォルトです[23] )。ただし、FLDCW「浮動小数点ロード制御ワード」命令を使用して、個々のプログラム内でこれをオーバーライドできます。[22] x86_64では、BSDはデフォルトで80ビット拡張精度に設定されます。Visual C++を搭載したMicrosoft Windowsもプロセッサをデフォルトで倍精度モードに設定しますが、これも個々のプログラム内で上書きできます(たとえば、Visual C++の関数[24])。一方、x86用のIntel C++コンパイラは、デフォルトで拡張精度モードを有効にします。[25] IA-32 OS Xでは、80ビット拡張精度です。[26]long double_controlfp_slong double
その他の仕様
CORBA (「 ANSI/IEEE 標準 754-1985 」を参照として使用する 3.0 の仕様から)では、「long double データ型は、少なくとも 15 ビットの長さの指数と少なくとも 64 ビットの符号付き小数部を持つ IEEE 倍精度拡張浮動小数点数を表します」。GIOP/IIOP CDR の浮動小数点型は「浮動小数点数の IEEE 標準形式に正確に従います」が、これをIEEE 754-2008 binary128 (別名 4 倍精度) としてマーシャリングしますが、その名前は使用しません。
参照
参考文献
- ^ ANSI/ISO 9899-1990 プログラミング言語の米国規格 - C、セクション 6.1.2.5。
- ^ 「Long Double」。learn.microsoft.com . 2016 年 9 月 20 日。2022年 10 月 6 日閲覧。
- ^ Intel 開発者サイト
- ^ Hewlett Packard (1992)。「C プログラムの移植」。HP-UX 移植ガイド - HP 9000 コンピュータ(PDF) (第 2 版)。pp. 5-3 および 5-37。
- ^ 「IEEE 算術」。docs.oracle.com 。 2022年10月6日閲覧。
- ^ 「MIPSpro™ N32 ABI ハンドブック」(PDF) 1999 . 2020年5月26日閲覧。
- ^ 「Arm® 64 ビット アーキテクチャのプロシージャ呼び出し標準 (AArch64)」。GitHub。2020年 10 月 1 日。2020年 10 月 2 日のオリジナルからアーカイブ(PDF) 。
- ^ 「浮動小数点型」。IBM 2020-10-09 . 2020-10-09閲覧。
- ^ Schwarz, Eric (2015 年 6 月 22 日)。「IBM z13 SIMD アクセラレーター (整数、文字列、浮動小数点用)」(PDF) 。2015 年7 月 13 日閲覧。
- ^ Schwarz, EM; Krygowski, CA (1999 年 9 月). 「S/390 G5 浮動小数点ユニット」. IBM Journal of Research and Development . 43 (5/6): 707– 721. CiteSeerX 10.1.1.117.6711 . doi :10.1147/rd.435.0707.
- ^ 「Power ISA 128 ビット long double の物語」 2018 年 12 月 22 日. 2021 年 12 月 26 日閲覧。
- ^ 「ARM® コンパイラ ツールチェーン コンパイラ リファレンス、バージョン 5.03」(PDF)。2013 年。セクション 6.3基本データ型。2019 年 11 月 8 日に取得。
- ^ “llvm/llvm-project”. GitHub . 2020年9月3日閲覧。
- ^ “llvm/llvm-project”. GitHub . 2020年9月3日閲覧。
- ^ 「System V アプリケーションバイナリインタフェース: MIPS(r) プロセッサ補足」(PDF) (第3版)。1996年。 2020年5月26日閲覧。
- ^ 「x86 オプション (GNU コンパイラ コレクション (GCC) の使用)」。gcc.gnu.org 。2022 年 10 月 6 日閲覧。
- ^ 「RS/6000 および PowerPC オプション (GNU コンパイラ コレクション (GCC) の使用)」。gcc.gnu.org 。2022 年 10 月 6 日閲覧。
- ^ Inside Macintosh - PowerPC Numerics 2012-10-09 にWayback Machineでアーカイブ
- ^ Darwin 用の 128 ビット長倍精度ルーチン
- ^ 「SPARC オプション (GNU コンパイラ コレクション (GCC) の使用)」。gcc.gnu.org 。2022 年 10 月 6 日閲覧。
- ^ 「GCC 4.3 リリースシリーズ — 変更点、新機能、修正 - GNU プロジェクト」。gcc.gnu.org 。2022年 10 月 6 日閲覧。
- ^ ab Brian J. Gough および Richard M. Stallman、「GCC 入門」、セクション 8.6「浮動小数点の問題」(Network Theory Ltd.、2004 年)。
- ^ 「NetBSD 6.0 から 7.0 への重要な変更」。
- ^ 「Visual Studio 2005 廃止されたドキュメント」。Microsoftダウンロード センター。2022年 10 月 6 日閲覧。
- ^ Intel C++ コンパイラのドキュメント、-fp-model (/fp) オプションの使用。
- ^ 「IA-32 関数呼び出し規約」。
