Long double (doble largo)

En C y otros lenguajes de programación similares, un long double se refiere a un tipo de dato de punto (o coma) flotante que suele ser más preciso que un double. Tal y como otros tipos de coma flotante de C, este no se adhiere necesariamente al formato IEEE de coma flotante.

long double en C editar

Historia editar

El tipo long double estaba presente en el estándar de C de 1989, pero el soporte fue mejorado en la revisión del estándar de C de 1999, o C99, el cual extendió la biblioteca estándar para incluir las funciones que operan en long double como sinl() y strtold().

Las constantes dobles largas son constantes de punto flotante seguidas del sufijo "L" o "l" (L minúscula), p. ej., 0.333333333333333333L. Sin un sufijo, la evaluación depende de FLT_EVAL_METHOD.

Implementaciones editar

En la arquitectura x86, la mayoría de compiladores de C implementan el long double como el tipo de dato de 80 bits de precisión extendida soportado por el hardware x86 (a veces almacenado como 12 o 16 bytes para mantener la alineación de datos), tal y como se especifica en los estándares C99/C11 (IEC 60559 floating-point arithmetic (Anexo F)). Una excepción es Microsoft Visual C++ para x86, el cual hace de long double un sinónimo de double. El compilador C++ de Intel para Microsoft Windows soporta precisión extendida, pero requiere del modificador /Qlong‑double para que los long double se correspondan al formato de precisión extendido de hardware.[1]

Los compiladores también pueden usar long double para conseguir un formato de precisión cuádruple de 128 bits. Este es el caso en el HP-UX[2]​ y en máquinas Solaris/SPARC.[3]​ Actualmente, este formato solo se implementa en software debido a carencia de soporte en hardware.

En algunas máquinas PowerPC y SPARCv9, los long double están implementados como aritmética doble-doble, donde un valor long double está considerado como la suma exacta de dos valores de precisión doble, dando al menos una precisión de 106 bits. Con tal formato, el tipo long double no conforma el estándar IEEE de coma flotante[cita requerida]. Si no, un long double sería sencillamente un sinónimo para double (de precisión doble).

Con el compilador C GNU, long double es una extensión de 80 bits de precisión en procesadores x86 sin importar el espacio utilizado por el tipo de dato (que pueden ser 96 o 128 bits). En otras arquitecturas, un long double puede ser un doble-doble (por ejemplo en PowerPC[4][5]​) o cuádruplo de 128 bits (por ejemplo en SPARC).[6]​ Desde gcc 4.3, una precisión cuádruple es también soportada en x86, pero usando el tipo no estándar __float128 y no el long double.[7]

A pesar de que la arquitectura x86, y específicamente el conjunto de instrucciones de coma flotante x87 para x86, soporta operaciones de 80 bits con precisión extendida, es posible de configurar el procesador para que redondee automáticamente las operaciones a precisión doble (o incluso simple). Sin embargo, en modo de precisión extendida, la precisión extendida puede ser utilizada para efectuar cálculos intermedios generados por el compilador incluso cuando los resultados finales se almacenan en una precisión más baja. Con gcc para Linux, la precisión extendida de 80 bits es la utilizada por defecto; en varios sistemas operativos BSD (FreeBSD y OpenBSD), el modo de precisión doble es el usado por defecto, y las operaciones con long double son reducidas a precisión doble.[8]​ (NetBSD 7.0 y siguientes, por el contrario, usan la precisión extendida de 80 bits por defecto).[9]​ Aun así, es posible a anular esto dentro de un programa individual a través del FLDCW (floating-point load control-word o "palabra de control de carga de instrucción de punto flotante"). En x86_64, las variantes de BSD utilizan la precisión extendida de 80 bits por defecto. Microsoft Windows con Visual C++ también pone el procesador en modo de precisión doble por defecto, pero esto, de nuevo, puede ser anulado dentro de un programa (por ejemplo con el uso de la función _controlfp_s en Visual C++).[10]​ El Compilador C++ de Intel para x86, sin embargo, habilita modo de precisión extendida por defecto.[11]​ En OS X, un long double es un número de precisión extendida de 80 bits.

Otras especificaciones editar

En CORBA (de la especificación 3.0, que usa el "Estándar 754-1985 ANSI/IEEE" como referencia), "el tipo de dato long double representa un número de coma flotante IEEE extendido doble, con un exponente de al menos 15 bits de longitud y una fracción con signo de al menos 64 bits", con GIOP/IIOP CDR, los tipos de datos de los cuales "siguen exactamente el formato estándar IEEE para números de coma flotante", clasificando esto como lo que parece ser un IEEE 754-2008 binary128, también conocido como un número de precisión cuádruple pero sin usar dicho nombre.

Referencias editar

  1. Intel Sitio de desarrollador
  2. Hewlett Packard (1992). «Porting C Programs». HP-UX Portability Guide - HP 9000 Computers (2nd edición). pp. 5-3 and 5-37. 
  3. Sol
  4. Dentro de Macintosh - PowerPC Numerics Archivado el 9 de octubre de 2012 en Wayback Machine.
  5. 128-bit long double support routines for Darwin
  6. SPARC Opciones
  7. GCC 4.3 Notas de Liberación
  8. Brian J. Gough Y Richard M. Stallman
  9. «Significant changes from NetBSD 6.0 to 7.0». 
  10. Red de Desarrollador del Microsoft
  11. Intel C++ Documentación de Compilador