Formatos de punto flotante |
---|
IEEE 754 |
|
Otro |
Alternatives |
Tapered floating point |
En C y lenguajes de programación relacionados , long double
se refiere a un tipo de datos de punto flotante que suele ser 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 se asigne necesariamente a un formato IEEE .double
long double
CªEl long double
tipo estaba presente en el estándar C original de 1989, [1] pero el soporte fue mejorado por 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
como sinl()
y strtold()
.
Las constantes dobles largas son constantes de punto flotante con el sufijo "L" o "l" (L minúscula), p. ej., 0,333333333333333333333333333333333333L o 3,1415926535897932384626433832795029L para precisión cuádruple . Sin un 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 (aritmética de punto flotante IEC 60559 (Anexo F)). Una excepción es Microsoft Visual C++ para x86, que crea long double
un sinónimo para double
. [2] El compilador Intel C++ en Microsoft Windows admite precisión extendida, pero requiere que el /Qlong‑double
modificador para long double
corresponda con el formato de precisión extendida del hardware. [3]
Los compiladores también pueden utilizar long double
el formato binario de punto flotante 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 las convenciones de llamada AAPCS estándar, 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-doblelong double
, donde un valor se considera como la suma exacta de dos valores de doble precisión, lo que da al menos una precisión de 106 bits; con dicho 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 es 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 (por ejemplo, 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, soportan operaciones de precisión extendida de 80 bits, es posible configurar el procesador para redondear automáticamente las operaciones a precisión doble (o incluso simple). Por el contrario, en el modo de precisión extendida, la precisión extendida puede usarse para cálculos intermedios generados por el compilador incluso cuando los resultados finales se almacenan con una precisión menor (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 precisión doble. [22] ( NetBSD 7.0 y posteriores, sin embargo, tienen como valor predeterminado una precisión extendida de 80 bits [23] ). Sin embargo, es posible anular esto dentro de un programa individual a través de la instrucción FLDCW "floating-point load control-word". [22] En x86_64, los BSD tienen como valor predeterminado 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 volver a ser anulado 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 IEEE de doble extensión, 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", ordenando esto como lo que parece ser binario 128 IEEE 754-2008, también conocido como precisión cuádruple, sin usar ese nombre.