El formato en coma (o punto) flotante de doble precisión es un formato de número de computador u ordenador que ocupa 64 bits en su memoria y representa un amplio y dinámico rango de valores mediante el uso de la coma flotante. Este formato suele ser conocido como binary64 tal como se especifica en el estándar IEEE 754.[1] En los computadores antiguos fueron utilizados diferentes formatos de coma flotante de 8 bytes, como ejemplo, el tipo de datos de doble precisión en el lenguaje de programaciónGW-BASIC, el cual era un formato de coma flotante de 32 bits MBF (Formato Binario de Microsoft).
Descripción del formato
El formato binario en coma flotante de doble precisión es de uso común en los computadores personales, debido a su rango más amplio de trabajo con respecto al formato en coma flotante de simple precisión, a pesar de su rendimiento y su coste de ancho de banda. Al igual que con el formato de coma flotante de precisión simple, carece de precisión en números enteros cuando se compara con un formato entero del mismo tamaño. El estándar IEEE 754 establece que un número en formato binary64 consta de:
Bit de signo (S): 1 bit.
Exponente (E): 11 bits.
Significando o Mantisa: 53 bits (52 bits se almacenan explícitamente).
Si una cadena decimal con un máximo de 15 dígitos significativos se convierte en una representación de doble precisión y luego se convierte de nuevo a una cadena con el mismo número de dígitos significativos, a continuación, la cadena final debe coincidir con la original. Si un número en doble precisión se convierte en una cadena decimal con al menos 17 dígitos significativos y luego se convierte de nuevo en doble, el número final debe coincidir con el original.[2]
El formato se escribe con un significando que tiene un bit entero implícito de valor 1 (excepto para los números especiales). Con los 52 bits de la fracción o significando que aparecen en el formato de memoria, la precisión total es por lo tanto de 53 bits (es decir de 53*log10(2) ≈ 15.955 que se redondea a 16 dígitos decimales). Los bits se presentan de la siguiente manera:
Estructura de un número en formato de coma flotante de doble precisión.
El exponente de este formato está sesgado o desplazado en 1023 unidades, ya que como el máximo valor representado por 11 bits es 211-1=2047, es la mitad de este rango la que representa exponentes positivos y la otra, exponentes negativos, por lo que se usa la parte entera de la mitad de 2047. El valor verdadero () de un número de coma flotante de doble precisión es:
En el intervalo entre 252 (4 503 599 627 370 496) y 253 (9 007 199 254 740 992) el espaciado entre números es 1, por lo que solo son exactamente representables los números enteros (no se puede representar la parte decimal). Para el rango siguiente superior, de 253 a 254, todo se multiplica por 2, por lo que los números representables solo son los pares (espaciado 2), y así en lo sucesivo (aumentando el espaciado en potencias de 2). Simétricamente, para el rango anterior, de 251 a 252, el espaciado es de 0,5, pudiéndose representar exactamente los números enteros en este rango y los valores intermedios (0,5, 1,5, etc). En los rangos que les anteceden el espaciado entre números representables se va reduciendo en potencias de 2. La separación como una fracción de los números en el intervalo de 2n a 2n+1 es 2n-52. El error máximo de redondeo relativo cuando se redondea un número al representable más próximo (denominado el épsilon de la máquina) es por lo tanto 2-53.
El ancho de 11 bits del exponente permite la representación de números en el rango comprendido entre 2-1023 y 2+1023 (10-308 y 10+308), con una precisión de 15 a 17 dígitos decimales completos. Al comprometer la precisión, la representación subnormal permite valores incluso más pequeños hasta aproximadamente 5 × 10-324.
Codificación del exponente
El exponente del formato en coma flotante de doble precisión es codificado usando una representación binaria sesgada en 1023 unidades, de modo que para obtener el exponente verdadero,debe restarse el sesgo de 1023 del exponente calculado.
Los exponentes 00016 y 7ff16 tienen un significado especial:
00016 se usa para representar ceros con signo (mantisa cero) y números subnormales (mantisa no nula).
7ff16 se usa para representar el valor infinito (∞), con mantisa cero y las cadenas no numéricas o NaN, con mantisa no nula.
donde F es la parte fraccionaria del significando o mantisa.
Todos los patrones de bits son de codificación válida. Excepto en los casos anteriores, todo número de doble precisión se describe por:
En el caso de valores subnormales, el número de doble precisión se describe mediante:
Velocidad de ejecución con aritmética de doble precisión
La utilización de variables de coma flotante de doble precisión y funciones matemáticas (por ejemplo: seno, coseno, arcotangente, logaritmo, exponencial y raíz cuadrada) es más lenta que trabajar con sus contrapartes de simple precisión. Un área de computación donde se trata de un problema particular es para el código paralelo que se ejecuta en las GPUs. Por ejemplo, cuando se utiliza la plataforma CUDA de NVIDIA, en las tarjetas de video diseñadas para juegos, los cálculos con doble precisión tardan 3 a 24 veces más en completarse que los cálculos con simple precisión.[3]
Implementaciones
Los formatos de coma flotante de doble precisión son implementados en muchos lenguajes de programación en diversas formas. Los procesadores que solo poseen precisión dinámica como los x86 sin SSE2 (o cuando SSE2 no es usado, para propósitos de compatibilidad) y con precisión extendida, usada por defecto, el software puede tener dificultades para cumplir ciertos requisitos.
C y C++
Cy C++ ofrecen una amplia variedad de tipos aritméticos. El formato de doble precisión no es requerido por los estándares de estos lenguajes (excepto por el Anexo F opcional de C99 que cubre la aritmética de la norma IEEE 754), pero en la mayoría de los sistemas el tipo de variable double corresponde a la doble precisión. Sin embargo, en procesadores x86 de 32 bits con precisión extendida por defecto, algunos compiladores pueden no cumplir con el estándar C y/o la aritmética puede sufrir problemas de doble redondeo.[4]
Object Pascal
Si bien las versiones tempranas de Pascal y Turbo Pascal no tenían soporte para Doble precisión, actualmente existe soporte completo para números en coma flotantes de doble precisisón en los compiladores más usados para Object Pascal. Delphi, y Free Pascal incluyen el tipo Double como números en coma flotante de 64 bits de acuerdo al estándar IEEE-754.
Common Lisp
El lenguaje de programación Common Lisp proporciona los tipos de variables SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT y LONG-FLOAT. La mayoría de las implementaciones proporcionan tipos SINGLE-FLOAT y DOUBLE-FLOAT con los otros tipos de sinónimos apropiados. Common Lisp proporciona excepciones para capturar subflujos de coma flotante y desbordamientos y la excepción de coma flotante inexacta, según IEEE 754. No hay valores infinitos y las expresiones no numéricas (NaNs) se describen en el estándar ANSI, sin embargo, varias implementaciones sí proporcionan estas como extensiones.
JavaScript
Tal como se especifica en la norma ECMAScript, toda la aritmética en JavaScript se realizará utilizando aritmética de coma flotante de doble precisión.[5]
Lua
En la versión 5.2[6] de Lua y anteriores, se usa aritmética de coma flotante de doble precisión. Además, se proporcionan conversiones de tipo automático entre variables double (doble precisión) y string (cadenas).