Long double
In C and related programming languages,
long double refers to a floating-point data type that is often more precise than floating-point format|double precision] though the language standard only requires it to be at least as precise as double. As with C's other floating-point types, it may not necessarily map to an IEEE format.long double in C
History
Thelong double type was present in the original 1989 C standard, but support was improved by the 1999 revision of the C standard, or C99, which extended the standard library to include functions operating on long double such as sinl and strtold.Long double constants are floating-point constants suffixed with "L" or "l", e.g., 0.3333333333333333333333333333333333L or 3.1415926535897932384626433832795029L for quadruple precision. Without a suffix, the evaluation depends on FLT_EVAL_METHOD.
Implementations
On the x86 architecture, most C compilers implementlong double as the 80-bit extended precision type supported by x86 hardware, as specified in the C99 / C11 standards. An exception is Microsoft Visual C++ for x86, which makes long double a synonym for double. The Intel C++ compiler on Microsoft Windows supports extended precision, but requires the /Qlong‑double switch for long double to correspond to the hardware's extended precision format.Compilers may also use
long double for the IEEE 754 quadruple-precision binary floating-point format. This is the case on HP-UX, Solaris/SPARC, MIPS with the 64-bit or n32 ABI, 64-bit ARM (AArch64), and z/OS with FLOAT. Most implementations are in software, but some processors have hardware support.On some PowerPC systems,
long double is implemented as a double-double arithmetic, where a long double value is regarded as the exact sum of two double-precision values, giving at least a 106-bit precision; with such a format, the long double type does not conform to the IEEE floating-point standard. Otherwise, long double is simply a synonym for double, e.g. on 32-bit ARM, 64-bit ARM (AArch64) and on 32-bit MIPS.With the GNU C Compiler,
long double is 80-bit extended precision on x86 processors regardless of the physical storage used for the type, On some other architectures, long double can be double-double or 128-bit quadruple precision. As of gcc 4.3, a quadruple precision is also supported on x86, but as the nonstandard type __float128 rather than long double.Although the x86 architecture, and specifically the x87 floating-point instructions on x86, supports 80-bit extended-precision operations, it is possible to configure the processor to automatically round operations to double precision. Conversely, in extended-precision mode, extended precision may be used for intermediate compiler-generated calculations even when the final results are stored at a lower precision. With gcc on Linux, 80-bit extended precision is the default; on several BSD operating systems, double-precision mode is the default, and
long double operations are effectively reduced to double precision. . However, it is possible to override this within an individual program via the FLDCW "floating-point load control-word" instruction. On x86_64, the BSDs default to 80-bit extended precision. Microsoft Windows with Visual C++ also sets the processor in double-precision mode by default, but this can again be overridden within an individual program. The Intel C++ Compiler for x86, on the other hand, enables extended-precision mode by default. On IA-32 OS X, long double is 80-bit extended precision.