32

重複の可能性:
ロング ダブル vs ダブル

私はプログラミングが初めてで、C と C++ の long double と double の違いを理解できません。Googleで検索してみましたが、理解できず混乱しました。誰でも助けてください。

4

3 に答える 3

48

C++ 標準、§3.9.1 ¶8 を引用するには:

浮動小数点型には、float、double、long double の 3 つがあります。double 型は少なくとも float と同じ精度を提供し、型 long double は少なくとも double と同じ精度を提供します。float 型の値のセットは、double 型の値のセットのサブセットです。double 型の値のセットは、long double 型の値のセットのサブセットです。浮動小数点型の値表現は実装定義です。整数型と浮動小数点型をまとめて算術型と呼びます。標準テンプレート std::numeric_limits (18.3) の特殊化は、実装の各算術型の最大値と最小値を指定するものとします。

つまり、 はdoubleその表現に少なくとも と同じ量のメモリを必要floatlong doubledoubleます。その余分なメモリは、数値をより正確に表現するために使用されます。

x86 システムでfloatは、通常 4 バイトの長さで、最大で約 3×10³⁸、最小で約 1.4×10⁻⁴⁵ の数値を格納できます。これは、小数の約 7 桁の 10 進数を格納する IEEE 754単精度数です。

また、x86 システムでは、double長さは 8 バイトで、IEEE 754倍精度形式で数値を格納できます。この形式は、はるかに広い範囲を持ち、より高い精度 (10 進数で約 15 桁) の数値を格納します。他の一部のプラットフォームでdoubleは、長さが 8 バイトでない場合があり、実際には単精度の と同じである場合がありますfloat

標準でlong doubleは、少なくとも と同じくらい正確であることのみを要求するdoubleため、一部のコンパイラは単純long doubleに と同じであるかのように扱いdoubleます。ただし、ほとんどの x86 チップでは、10 バイトの拡張精度形式の 80 ビット数が、CPU の浮動小数点ユニットを介して使用できます。これは、64 ビットよりもさらに高い精度を提供し、double10 進数で約 21 桁の精度を備えています。

一部のコンパイラは、16 バイト (128 ビット) の IEEE 754 4 倍精度数値形式を代わりにサポートし、より正確な表現とより広い範囲をサポートします。

于 2013-01-08T18:43:56.043 に答える
18

コンパイラによって異なりますが、次のコードで各型に必要なバイト数を確認できます。

int main() { 
    printf("%d\n", sizeof(double)); // some compilers print 8
    printf("%d\n", sizeof(long double)); // some compilers print 16
    return 0;
}
于 2013-01-08T18:37:05.067 に答える
10

コンパイラによっては、データ型long <type>がデータ型よりも大きな値を保持する場合があります。<type>

于 2013-01-08T18:38:13.503 に答える