largo doble

Tipos de datos de punto flotante en los lenguajes de la familia C

En C y lenguajes de programación relacionados , long doublese 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

Historia

El long doubletipo 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 doublecomo 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 .

Implementaciones

En la arquitectura x86 , la mayoría de los compiladores de C implementan long doublecomo 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 doubleun sinónimo para double. [2] El compilador Intel C++ en Microsoft Windows admite precisión extendida, pero requiere que el /Qlong‑doublemodificador para long doublecorresponda con el formato de precisión extendida del hardware. [3]

Los compiladores también pueden utilizar long doubleel 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 doubletipo no se ajusta al estándar de punto flotante IEEE . De lo contrario, long doublees 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 doublela 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 doublepuede 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 __float128en 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 doublelas 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_sfunció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 doublela precisión extendida es de 80 bits. [26]

Otras especificaciones

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.

Véase también

Referencias

  1. ^ ANSI/ISO 9899-1990 Estándar nacional estadounidense para lenguajes de programación - C, sección 6.1.2.5.
  2. ^ "Long Double". learn.microsoft.com . 20 de septiembre de 2016 . Consultado el 6 de octubre de 2022 .
  3. ^ Sitio para desarrolladores de Intel
  4. ^ Hewlett Packard (1992). "Porting C Programs" (Portar programas C). Guía de portabilidad de HP-UX: computadoras HP 9000 (PDF) (2.ª ed.). págs. 5-3 y 5-37.
  5. ^ "Aritmética IEEE". docs.oracle.com . Consultado el 6 de octubre de 2022 .
  6. ^ "Manual de ABI MIPSpro™ N32" (PDF) . 1999. Consultado el 26 de mayo de 2020 .
  7. ^ "Estándar de llamada a procedimientos para la arquitectura Arm® de 64 bits (AArch64)". GitHub . 2020-10-01. Archivado (PDF) del original el 2020-10-02.
  8. ^ "Tipos de coma flotante". IBM . 2020-10-09 . Consultado el 2020-10-09 .
  9. ^ Schwarz, Eric (22 de junio de 2015). "Los aceleradores IBM z13 SIMD para números enteros, cadenas y coma flotante" (PDF) . Consultado el 13 de julio de 2015 .
  10. ^ Schwarz, EM; Krygowski, CA (septiembre de 1999). "La unidad de coma flotante 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. 
  11. ^ "La saga del Power ISA 128-bit long double". 22 de diciembre de 2018. Consultado el 26 de diciembre de 2021 .
  12. ^ "Referencia del compilador ARM® Compiler toolchain, versión 5.03" (PDF) . 2013. Sección 6.3 Tipos de datos básicos . Consultado el 8 de noviembre de 2019 .
  13. ^ "llvm/llvm-project". GitHub . Consultado el 3 de septiembre de 2020 .
  14. ^ "llvm/llvm-project". GitHub . Consultado el 3 de septiembre de 2020 .
  15. ^ "System V Application Binary Interface: MIPS(r) Processor Supplement" (PDF) (3.ª ed.). 1996 . Consultado el 26 de mayo de 2020 .
  16. ^ "Opciones x86 (Uso de la colección de compiladores GNU (GCC))". gcc.gnu.org . Consultado el 6 de octubre de 2022 .
  17. ^ "Opciones de RS/6000 y PowerPC (utilizando la colección de compiladores GNU (GCC))". gcc.gnu.org . Consultado el 6 de octubre de 2022 .
  18. ^ Dentro de Macintosh - PowerPC Numerics Archivado el 9 de octubre de 2012 en Wayback Machine
  19. ^ Rutinas de soporte doble de 128 bits de longitud para Darwin
  20. ^ "Opciones SPARC (Uso de la colección de compiladores GNU (GCC))". gcc.gnu.org . Consultado el 6 de octubre de 2022 .
  21. ^ "Serie de versiones GCC 4.3: cambios, nuevas características y correcciones - Proyecto GNU". gcc.gnu.org . Consultado el 6 de octubre de 2022 .
  22. ^ ab Brian J. Gough y Richard M. Stallman, Introducción a GCC , sección 8.6 Problemas de punto flotante (Network Theory Ltd., 2004).
  23. ^ "Cambios significativos de NetBSD 6.0 a 7.0".
  24. ^ "Documentación retirada de Visual Studio 2005". Centro de descargas de Microsoft . Consultado el 6 de octubre de 2022 .
  25. ^ Documentación del compilador Intel C++, uso de la opción -fp-model (/fp).
  26. ^ "Convenciones de llamada de función IA-32".
Retrieved from "https://en.wikipedia.org/w/index.php?title=Long_double&oldid=1254910222"