En C y lenguajes de programación relacionados , long double
se refiere a un tipo de datos de punto flotante que a menudo es más preciso que la precisión doble , aunque el estándar del lenguaje solo requiere que sea al menos tan preciso como . Al igual que con otros tipos de punto flotante de C, es posible que no necesariamente se asigne a un formato IEEE .double
El long double
tipo estaba presente en el estándar C original de 1989, [1] pero el soporte mejoró con la revisión de 1999 del estándar C, o C99 , que amplió la biblioteca estándar para incluir funciones que operan en long double
tales como sinl()
y strtold()
.
Las constantes dobles largas son constantes de punto flotante con el sufijo "L" o "l" (L minúscula), por ejemplo, 0.3333333333333333333333333333333333L o 3.1415926535897932384626433832795029L para precisión cuádruple . Sin sufijo, la evaluación depende de FLT_EVAL_METHOD .
En la arquitectura x86 , la mayoría de los compiladores de C implementan long double
como el tipo de precisión extendida de 80 bits compatible con el hardware x86 (generalmente almacenado como 12 o 16 bytes para mantener la alineación de la estructura de datos ), como se especifica en los estándares C99 / C11 (IEC 60559 de punto flotante). aritmética (Anexo F)). Una excepción es Microsoft Visual C++ para x86, que es long double
sinónimo de double
. [2] El compilador Intel C++ en Microsoft Windows admite precisión extendida, pero requiere que el /Qlong‑double
modificador long double
corresponda al formato de precisión extendida del hardware. [3]
Los compiladores también pueden utilizar long double
el formato de punto flotante binario de precisión cuádruple IEEE 754 (binary128). Este es el caso de HP-UX , [4] Solaris / SPARC , [5] MIPS con ABI de 64 bits o n32 , [6] ARM de 64 bits (AArch64) [7] (en sistemas operativos que utilizan el estándar AAPCS convenciones de llamada, como Linux) y z/OS con FLOAT(IEEE) [8] [9] [10] . La mayoría de las implementaciones están en software, pero algunos procesadores tienen soporte de hardware .
En algunos sistemas PowerPC , [11] long double
se implementa como una aritmética doble-doble , donde un long double
valor se considera la suma exacta de dos valores de doble precisión, dando al menos una precisión de 106 bits; con tal formato, el long double
tipo no se ajusta al estándar de punto flotante IEEE . De lo contrario, long double
es simplemente un sinónimo de (doble precisión), por ejemplo, en ARMdouble
de 32 bits , [12] ARM de 64 bits (AArch64) (en Windows [13] y macOS [14] ) y en MIPS de 32 bits [15] (antiguo ABI, también conocido como o32).
Con el compilador GNU C , long double
la precisión extendida de 80 bits en procesadores x86 independientemente del almacenamiento físico utilizado para el tipo (que puede ser de 96 o 128 bits), [16] en algunas otras arquitecturas, long double
puede ser doble-doble (p. ej. en PowerPC [17] [18] [19] ) o precisión cuádruple de 128 bits (por ejemplo, en SPARC [20] ). A partir de gcc 4.3, también se admite una precisión cuádruple en x86, pero como tipo no estándar __float128
en lugar de long double
. [21]
Aunque la arquitectura x86, y específicamente las instrucciones de punto flotante x87 en x86, admiten operaciones de precisión extendida de 80 bits, es posible configurar el procesador para redondear automáticamente las operaciones al doble (o incluso simple) de precisión. Por el contrario, en el modo de precisión extendida, la precisión extendida se puede usar para cálculos intermedios generados por el compilador incluso cuando los resultados finales se almacenan con una precisión más baja (es decir, FLT_EVAL_METHOD == 2 ). Con gcc en Linux , la precisión extendida de 80 bits es la predeterminada; En varios sistemas operativos BSD ( FreeBSD y OpenBSD ), el modo de doble precisión es el predeterminado y long double
las operaciones se reducen efectivamente a doble precisión. [22] ( Sin embargo, NetBSD 7.0 y posteriores tienen por defecto una precisión extendida de 80 bits [23] ). Sin embargo, es posible anular esto dentro de un programa individual mediante la instrucción FLDCW "palabra de control de carga de punto flotante". [22] En x86_64, los BSD tienen por defecto una precisión extendida de 80 bits. Microsoft Windows con Visual C++ también configura el procesador en modo de doble precisión de forma predeterminada, pero esto puede anularse nuevamente dentro de un programa individual (por ejemplo, mediante la _controlfp_s
función en Visual C++ [24] ). El compilador Intel C++ para x86, por otro lado, habilita el modo de precisión extendida de forma predeterminada. [25] En IA-32 OS X, long double
la precisión extendida es de 80 bits. [26]
En CORBA (de la especificación 3.0, que utiliza el " Estándar ANSI/IEEE 754-1985 " como referencia), "el tipo de datos doble largo representa un número de punto flotante doblemente extendido IEEE, que tiene un exponente de al menos 15 bits de longitud y una fracción con signo de al menos 64 bits", con GIOP/IIOP CDR, cuyos tipos de punto flotante "siguen exactamente los formatos estándar IEEE para números de punto flotante", agrupando esto como lo que parece ser IEEE 754-2008 binario128 también conocido como precisión cuádruple sin usar ese nombre.