stringtranslate.com

doble largo

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

long doubleCª

Historia

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

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 (IEC 60559 de punto flotante). aritmética (Anexo F)). Una excepción es Microsoft Visual C++ para x86, que es long doublesinónimo de double. [2] El compilador Intel C++ en Microsoft Windows admite precisión extendida, pero requiere que el /Qlong‑doublemodificador long doublecorresponda al formato de precisión extendida del hardware. [3]

Los compiladores también pueden utilizar long doubleel 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 doublevalor 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 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 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 (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 __float128en 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 doublelas 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_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 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.

Ver también

Referencias

  1. ^ ANSI/ISO 9899-1990 Estándar nacional americano para lenguajes de programación - C, sección 6.1.2.5.
  2. ^ "Doble largo". aprender.microsoft.com . Consultado el 6 de octubre de 2022 .
  3. ^ Sitio para desarrolladores de Intel
  4. ^ Hewlett-Packard (1992). "Migración de programas C". Guía de portabilidad 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 de MIPSpro ™ N32" (PDF) . 1999 . Consultado el 26 de mayo de 2020 .
  7. ^ "Estándar de llamada de procedimiento para la arquitectura Arm® de 64 bits (AArch64)". GitHub . 2020-10-01. Archivado (PDF) desde el original el 2 de octubre de 2020.
  8. ^ "Tipos de coma flotante". IBM . 2020-10-09 . Consultado el 9 de octubre de 2020 .
  9. ^ Schwarz, Eric (22 de junio de 2015). "Los aceleradores SIMD IBM z13 para números enteros, cadenas y puntos flotantes" (PDF) . Consultado el 13 de julio de 2015 .
  10. ^ Schwarz, EM; Krygowski, CA (septiembre de 1999). "La unidad de punto flotante S/390 G5". Revista IBM de investigación y desarrollo . 43 (5/6): 707–721. CiteSeerX 10.1.1.117.6711 . doi :10.1147/rd.435.0707. 
  11. ^ "La saga del doble largo Power ISA de 128 bits". 2018-12-22 . Consultado el 26 de diciembre de 2021 .
  12. ^ "Referencia del compilador de la cadena de herramientas del compilador ARM®, 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-proyecto". GitHub . Consultado el 3 de septiembre de 2020 .
  14. ^ "llvm/llvm-proyecto". GitHub . Consultado el 3 de septiembre de 2020 .
  15. ^ "Interfaz binaria de aplicación System V: Suplemento del procesador MIPS (r)" (PDF) (3ª ed.). 1996 . Consultado el 26 de mayo de 2020 .
  16. ^ "Opciones x86 (usando la colección de compiladores GNU (GCC))". gcc.gnu.org . Consultado el 6 de octubre de 2022 .
  17. ^ "Opciones 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 doble soporte 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 lanzamientos de GCC 4.3: cambios, nuevas funciones 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 descarga 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 funciones IA-32".