El estándar IEEE para aritmética de punto flotante ( IEEE 754 ) es un estándar técnico para la aritmética de punto flotante establecido originalmente en 1985 por el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE). El estándar abordó muchos problemas encontrados en las diversas implementaciones de punto flotante que dificultaban su uso de manera confiable y portátil . Muchas unidades de punto flotante de hardware utilizan el estándar IEEE 754.
La norma define:
IEEE 754-2008 , publicado en agosto de 2008, incluye casi la totalidad del estándar IEEE 754-1985 original , además del estándar IEEE 854-1987 para aritmética de punto flotante independiente de la base . La versión actual, IEEE 754-2019, se publicó en julio de 2019. [1] Es una revisión menor de la versión anterior, que incorpora principalmente aclaraciones, correcciones de defectos y nuevas operaciones recomendadas.
La necesidad de un estándar de punto flotante surgió del caos en la industria de la computación científica y empresarial en los años 1960 y 1970. IBM utilizó un formato de punto flotante hexadecimal con un significado más largo y un exponente más corto [ aclaración necesaria ] . Las computadoras CDC y Cray utilizaron la representación del complemento a uno , que admite un valor de +0 y −0. Las computadoras CDC de 60 bits no tenían sumadores completos de 60 bits, por lo que la aritmética de números enteros estaba limitada a 48 bits de precisión de la unidad de punto flotante. El procesamiento de excepciones de división por cero era diferente en diferentes computadoras. Mover datos entre sistemas e incluso repetir los mismos cálculos en diferentes sistemas era a menudo difícil.
El primer estándar IEEE para aritmética de punto flotante, IEEE 754-1985 , se publicó en 1985. Cubría únicamente la aritmética binaria de punto flotante.
En agosto de 2008 se publicó una nueva versión, IEEE 754-2008 , tras un proceso de revisión de siete años, presidido por Dan Zuras y editado por Mike Cowlishaw . Reemplazó tanto a IEEE 754-1985 (aritmética binaria de punto flotante) como a IEEE 854-1987 Standard for Radix-Independent Floating-Point Arithmetic . Los formatos binarios del estándar original se incluyen en este nuevo estándar junto con tres nuevos formatos básicos, uno binario y dos decimales. Para cumplir con el estándar actual, una implementación debe implementar al menos uno de los formatos básicos como formato aritmético y como formato de intercambio.
La norma internacional ISO/IEC/IEEE 60559:2011 (con contenido idéntico al IEEE 754-2008) ha sido aprobada para su adopción a través de ISO / IEC JTC 1 /SC 25 bajo el Acuerdo ISO/IEEE PSDO [2] [3] y publicada. [4]
La versión actual, IEEE 754-2019 publicada en julio de 2019, se deriva de IEEE 754-2008 y la reemplaza, luego de un proceso de revisión iniciado en septiembre de 2015, presidido por David G. Hough y editado por Mike Cowlishaw. Incorpora principalmente aclaraciones (por ejemplo, totalOrder ) y correcciones de defectos (por ejemplo, minNum ), pero también incluye algunas nuevas operaciones recomendadas (por ejemplo, augmentedAddition ). [5] [6]
La norma internacional ISO/IEC 60559:2020 (con contenido idéntico al IEEE 754-2019) ha sido aprobada para su adopción a través de ISO/IEC JTC 1 /SC 25 y publicada. [7]
La próxima revisión prevista de la norma será en 2029. [8]
Un formato IEEE 754 es un "conjunto de representaciones de valores numéricos y símbolos". Un formato también puede incluir cómo se codifica el conjunto. [9]
Un formato de punto flotante se especifica mediante
Un formato comprende
Por ejemplo, si b = 10, p = 7 y emax = 96, entonces emin = −95, el mantisa satisface 0 ≤ c ≤9 999 999 , y el exponente satisface −101 ≤ q ≤ 90 . En consecuencia, el número positivo distinto de cero más pequeño que se puede representar es 1×10 −101 , y el más grande es 9999999×10 90 (9,999999×10 96 ), por lo que el rango completo de números es −9,999999×10 96 hasta 9,999999×10 96 . Los números − b 1− emax y b 1− emax (aquí, −1×10 −95 y 1×10 −95 ) son los números normales más pequeños (en magnitud) ; los números distintos de cero entre estos números más pequeños se denominan números subnormales .
Algunos números pueden tener varias representaciones posibles en coma flotante. Por ejemplo, si b = 10 y p = 7, entonces −12,345 se puede representar mediante −12345×10 −3 , −123450×10 −4 y −1234500×10 −5 . Sin embargo, para la mayoría de las operaciones, como las operaciones aritméticas, el resultado (valor) no depende de la representación de las entradas.
Para los formatos decimales, cualquier representación es válida y el conjunto de estas representaciones se denomina cohorte . Cuando un resultado puede tener varias representaciones, el estándar especifica qué miembro de la cohorte se elige.
Para los formatos binarios, la representación se hace única al elegir el exponente representable más pequeño que permita que el valor se represente exactamente. Además, el exponente no se representa directamente, sino que se agrega un sesgo para que el exponente representable más pequeño se represente como 1, y se usa 0 para números subnormales. Para los números con un exponente en el rango normal (el campo del exponente no es todo unos ni todo ceros), el bit inicial del mantis siempre será 1. En consecuencia, un 1 inicial puede estar implícito en lugar de estar presente explícitamente en la codificación de memoria, y bajo el estándar la parte representada explícitamente del mantis estará entre 0 y 1. Esta regla se llama convención de bits iniciales , convención de bits implícita o convención de bits ocultos . Esta regla permite que el formato binario tenga un bit adicional de precisión. La convención de bits iniciales no se puede usar para los números subnormales ya que tienen un exponente fuera del rango de exponentes normales y se escala por el exponente representado más pequeño como se usa para los números normales más pequeños.
Debido a la posibilidad de múltiples codificaciones (al menos en formatos llamados formatos de intercambio ), un NaN puede llevar otra información: un bit de signo (que no tiene significado, pero puede ser utilizado por algunas operaciones) y una carga útil , que está destinada a información de diagnóstico que indica la fuente del NaN (pero la carga útil puede tener otros usos, como el NaN-boxing [10] [11] [12] ).
El estándar define cinco formatos básicos que reciben su nombre por su base numérica y la cantidad de bits utilizados en su codificación de intercambio. Hay tres formatos básicos binarios de punto flotante (codificados con 32, 64 o 128 bits) y dos formatos básicos decimales de punto flotante (codificados con 64 o 128 bits). Los formatos binary32 y binary64 son los formatos simple y doble de IEEE 754-1985 respectivamente. Una implementación conforme debe implementar completamente al menos uno de los formatos básicos.
El estándar también define formatos de intercambio , que generalizan estos formatos básicos. [13] Para los formatos binarios, se requiere la convención de bits inicial. La siguiente tabla resume algunos de los posibles formatos de intercambio (incluidos los formatos básicos).
En la tabla anterior, los valores enteros son exactos, mientras que los valores en notación decimal (por ejemplo, 1.0) son valores redondeados. Los exponentes mínimos que se enumeran son para números normales; la representación especial de números subnormales permite representar números incluso más pequeños (en magnitud) con cierta pérdida de precisión. Por ejemplo, el número positivo más pequeño que se puede representar en binario64 es 2 −1074 ; las contribuciones a la cifra −1074 incluyen el valor emin −1022 y todos menos uno de los 53 bits de mantisa (2 −1022 − (53 − 1) = 2 −1074 ).
Los dígitos decimales son la precisión del formato expresado en términos de un número equivalente de dígitos decimales. Se calcula como dígitos × log 10 base . Por ejemplo, el binario 128 tiene aproximadamente la misma precisión que un número decimal de 34 dígitos.
log 10 MAXVAL es una medida del rango de la codificación. Su parte entera es el exponente más grande que se muestra en la salida de un valor en notación científica con un dígito inicial en la mantisa antes del punto decimal (por ejemplo, 1,698·10 38 está cerca del valor más grande en binary32, 9,999999·10 96 es el valor más grande en decimal32).
Los formatos binary32 (simple) y binary64 (doble) son dos de los formatos más comunes que se utilizan en la actualidad. La siguiente figura muestra la precisión absoluta de ambos formatos en un rango de valores. Esta figura se puede utilizar para seleccionar un formato adecuado según el valor esperado de un número y la precisión requerida.
Un ejemplo de diseño para punto flotante de 32 bits es
y el diseño de 64 bits es similar.
El estándar especifica formatos de precisión ampliados y extensibles opcionales , que proporcionan una mayor precisión que los formatos básicos. [14] Un formato de precisión ampliado amplía un formato básico utilizando más precisión y un mayor rango de exponentes. Un formato de precisión ampliable permite al usuario especificar la precisión y el rango de exponentes. Una implementación puede utilizar cualquier representación interna que elija para dichos formatos; todo lo que necesita definirse son sus parámetros ( b , p y emax ). Estos parámetros describen de forma única el conjunto de números finitos (combinaciones de signo, mantisa y exponente para la base dada) que puede representar.
El estándar recomienda que los estándares de lenguaje proporcionen un método para especificar p y emax para cada base b admitida . [15] El estándar recomienda que los estándares de lenguaje y las implementaciones admitan un formato extendido que tenga una precisión mayor que el formato básico más grande admitido para cada base b . [16] Para un formato extendido con una precisión entre dos formatos básicos, el rango de exponentes debe ser tan grande como el del siguiente formato básico más amplio. Por ejemplo, un número binario de precisión extendida de 64 bits debe tener un 'emax' de al menos 16383. El formato extendido x87 de 80 bits cumple con este requisito.
El estándar IEEE 754-1985 original también tenía el concepto de formatos extendidos , pero sin ninguna relación obligatoria entre emin y emax . Por ejemplo, el formato de 80 bits Motorola 68881 , [17] donde emin = − emax , era un formato extendido conforme, pero dejó de cumplir las normas en la revisión de 2008.
Los formatos de intercambio están destinados al intercambio de datos de punto flotante utilizando una cadena de bits de longitud fija para un formato determinado.
Para el intercambio de números binarios en coma flotante se definen formatos de intercambio de longitud 16 bits, 32 bits, 64 bits y cualquier múltiplo de 32 bits ≥ 128 [e] . El formato de 16 bits está destinado al intercambio o almacenamiento de números pequeños (por ejemplo, para gráficos).
El esquema de codificación para estos formatos de intercambio binario es el mismo que el de IEEE 754-1985: un bit de signo, seguido de w bits de exponente que describen el exponente desplazado por un sesgo , y p − 1 bits que describen la mantisa. El ancho del campo de exponente para un formato de k bits se calcula como w = round(4 log 2 ( k )) − 13. Los formatos existentes de 64 y 128 bits siguen esta regla, pero los formatos de 16 y 32 bits tienen más bits de exponente (5 y 8 respectivamente) de los que proporcionaría esta fórmula (3 y 7 respectivamente).
Al igual que con IEEE 754-1985, el campo de exponente sesgado se llena con todos los bits 1 para indicar infinito (campo de significación final = 0) o un NaN (campo de significación final ≠ 0). Para los NaN, los NaN silenciosos y los NaN de señalización se distinguen utilizando exclusivamente el bit más significativo del campo de significación final, [f] y la carga útil se transporta en los bits restantes.
Para el intercambio de números decimales en coma flotante, se definen formatos de intercambio de cualquier múltiplo de 32 bits. Al igual que con el intercambio binario, el esquema de codificación para los formatos de intercambio decimal codifica el signo, el exponente y la mantisa. Se definen dos codificaciones diferentes a nivel de bits y el intercambio se complica por el hecho de que puede requerirse algún indicador externo de la codificación en uso.
Las dos opciones permiten codificar el mantisa como una secuencia comprimida de dígitos decimales utilizando decimales densamente empaquetados o, alternativamente, como un entero binario . La primera opción es más conveniente para la implementación directa del hardware del estándar, mientras que la segunda es más adecuada para la emulación de software en una computadora binaria. En cualquier caso, el conjunto de números (combinaciones de signo, mantisa y exponente) que se puede codificar es idéntico, y los valores especiales (±cero con el exponente mínimo, ±infinito, NaN silenciosos y NaN de señalización) tienen codificaciones idénticas.
La norma define cinco reglas de redondeo. Las dos primeras reglas redondean al valor más próximo; las demás se denominan redondeos dirigidos :
En los extremos, un valor con una magnitud estrictamente menor que se redondeará al número finito mínimo o máximo (dependiendo del signo del valor). Cualquier número con exactamente esta magnitud se considera un empate; esta elección de empate puede conceptualizarse como el punto medio entre y , que, si el exponente no estuviera limitado, sería el siguiente número de punto flotante representable de mayor magnitud. Los números con una magnitud estrictamente mayor que k se redondean al infinito correspondiente. [18]
"Redondear al más cercano, igual al par" es el valor predeterminado para el punto flotante binario y el valor predeterminado recomendado para el decimal. "Redondear al más cercano, igual al más lejano" solo es necesario para las implementaciones decimales. [19]
A menos que se especifique lo contrario, el resultado en coma flotante de una operación se determina aplicando la función de redondeo al resultado (matemático) infinitamente preciso. Se dice que una operación de este tipo está correctamente redondeada . Este requisito se denomina redondeo correcto . [20]
Las operaciones necesarias para un formato aritmético compatible (incluidos los formatos básicos) incluyen:
El estándar proporciona predicados de comparación para comparar un dato de punto flotante con otro en el formato aritmético admitido. [32] Cualquier comparación con un NaN se trata como desordenada. −0 y +0 se comparan como iguales.
El estándar proporciona un predicado totalOrder , que define un ordenamiento total de los miembros canónicos del formato aritmético admitido. [33] El predicado concuerda con los predicados de comparación (véase la sección § Predicados de comparación) cuando un número de punto flotante es menor que el otro. Las principales diferencias son: [34]
El predicado totalOrder no impone un orden total a todas las codificaciones de un formato. En particular, no distingue entre diferentes codificaciones de la misma representación de punto flotante, como cuando una o ambas codificaciones no son canónicas. [33] IEEE 754-2019 incorpora aclaraciones de totalOrder .
Para los formatos de intercambio binario cuya codificación sigue la recomendación IEEE 754-2008 sobre la ubicación del bit de señalización NaN , la comparación es idéntica a una que convierte los números de punto flotante en un entero de signo-magnitud (asumiendo un orden de carga útil consistente con esta comparación), un viejo truco para la comparación de FP sin una FPU. [35]
El estándar define cinco excepciones, cada una de las cuales devuelve un valor predeterminado y tiene un indicador de estado correspondiente que se activa cuando se produce la excepción. [g] No se requiere ningún otro manejo de excepciones, pero se recomiendan alternativas adicionales no predeterminadas (consulte § Manejo de excepciones alternativo).
Las cinco posibles excepciones son
Estas son las mismas cinco excepciones que se definieron en IEEE 754-1985, pero la excepción de división por cero se ha extendido a operaciones distintas de la división.
Algunas implementaciones de punto flotante decimal definen excepciones adicionales, [36] [37] que no son parte de IEEE 754:
Además, operaciones como cuantificar cuando alguno de los operandos es infinito o cuando el resultado no se ajusta al formato de destino también indicarán una excepción de operación no válida. [38]
En el estándar IEEE 754, el cero tiene signo, lo que significa que existe tanto un "cero positivo" (+0) como un "cero negativo" (−0). En la mayoría de los entornos de ejecución , el cero positivo suele imprimirse como " 0
" y el cero negativo como " -0
". Los dos valores se comportan como iguales en las comparaciones numéricas, pero algunas operaciones devuelven resultados diferentes para +0 y −0. Por ejemplo, 1/(−0) devuelve infinito negativo, mientras que 1/(+0) devuelve infinito positivo (de modo que se mantiene la identidad 1/(1/±∞) = ±∞ ). Otras funciones comunes con una discontinuidad en x = 0 que podrían tratar a +0 y −0 de forma diferente incluyen Γ ( x ) y la raíz cuadrada principal de y + xi para cualquier número negativo y . Al igual que con cualquier esquema de aproximación, las operaciones que involucran "cero negativo" ocasionalmente pueden causar confusión. Por ejemplo, en IEEE 754, x = y no siempre implica 1/ x = 1/ y , ya que 0 = −0 pero 1/0 ≠ 1/(−0) . [39] Además, para la raíz cuadrada recíproca, rSqrt(±0) es ±∞ mientras que la función matemática sobre los números reales no tiene ningún valor negativo.
Los valores subnormales llenan el espacio de desbordamiento con valores en los que la distancia absoluta entre ellos es la misma que la de los valores adyacentes que se encuentran justo fuera del espacio de desbordamiento. Esto supone una mejora con respecto a la práctica anterior de tener solo cero en el espacio de desbordamiento y donde los resultados de desbordamiento se reemplazaban por cero (se alineaban con cero). [40]
El hardware de punto flotante moderno generalmente maneja valores subnormales (así como valores normales) y no requiere emulación de software para valores subnormales.
Los infinitos de la línea de números reales extendida se pueden representar en tipos de datos de punto flotante IEEE, al igual que los valores de punto flotante ordinarios como 1, 1,5, etc. No son valores de error de ninguna manera, aunque a menudo se utilizan (dependiendo del redondeo) como valores de reemplazo cuando hay un desbordamiento. En una excepción de división por cero, se devuelve un infinito positivo o negativo como resultado exacto. Un infinito también se puede introducir como un numeral (como la macro "INFINITY" de C, o " ∞ " si el lenguaje de programación permite esa sintaxis).
IEEE 754 requiere que los infinitos se manejen de una manera razonable, como por ejemplo:
IEEE 754 especifica un valor especial llamado "No es un número" (NaN) que se devolverá como resultado de ciertas operaciones "no válidas", como 0/0, ∞×0 o sqrt(−1). En general, los NaN se propagarán, es decir, la mayoría de las operaciones que involucran un NaN darán como resultado un NaN, aunque las funciones que darían un resultado definido para cualquier valor de punto flotante dado también lo harán para los NaN, por ejemplo, NaN ^ 0 = 1. Hay dos tipos de NaN: los NaN silenciosos predeterminados y, opcionalmente, los NaN de señalización . Un NaN de señalización en cualquier operación aritmética (incluidas las comparaciones numéricas) hará que se señalice una excepción de "operación no válida".
La representación de los NaN especificada por el estándar tiene algunos bits no especificados que podrían utilizarse para codificar el tipo o la fuente de error; pero no existe ningún estándar para esa codificación. En teoría, un sistema en tiempo de ejecución podría utilizar la señalización de los NaN para marcar variables no inicializadas o ampliar los números de punto flotante con otros valores especiales sin ralentizar los cálculos con valores ordinarios, aunque dichas extensiones no son comunes.
Es un error muy común pensar que las características más esotéricas del estándar IEEE 754 que se analizan aquí, como los formatos extendidos, NaN, los infinitos, los subnormales, etc., son de interés únicamente para los analistas numéricos o para aplicaciones numéricas avanzadas. De hecho, ocurre lo contrario: estas características están diseñadas para proporcionar valores predeterminados seguros y robustos para programadores poco sofisticados en el ámbito numérico, además de dar soporte a bibliotecas numéricas sofisticadas para expertos. El diseñador clave del IEEE 754, William Kahan , señala que es incorrecto "... [considerar] características del estándar IEEE 754 para la aritmética binaria de punto flotante que... [no] son apreciadas como características que sólo pueden utilizar los expertos numéricos. Los hechos son todo lo contrario. En 1977, esas características se diseñaron en el Intel 8087 para servir al mercado más amplio posible... El análisis de errores nos dice cómo diseñar una aritmética de punto flotante, como el estándar IEEE 754, moderadamente tolerante con la ignorancia bienintencionada entre los programadores". [41]
Una propiedad de los formatos de precisión simple y doble es que su codificación permite ordenarlos fácilmente sin usar hardware de punto flotante, como si los bits representaran números enteros de magnitud de signo , aunque no está claro si esto fue una consideración de diseño (parece digno de mención que la representación de punto flotante hexadecimal anterior de IBM también tenía esta propiedad para números normalizados). Con la representación de complemento a dos predominante , interpretar los bits como números enteros con signo ordena los positivos correctamente, pero con los negativos invertidos; como una posible corrección para eso, con un xor para invertir el bit de signo para valores positivos y todos los bits para valores negativos, todos los valores se vuelven ordenables como números enteros sin signo (con −0 < +0 ). [35]
El estándar recomienda el manejo de excepciones opcional en varias formas, incluyendo la presustitución de valores predeterminados definidos por el usuario, y trampas (excepciones que cambian el flujo de control de alguna manera) y otros modelos de manejo de excepciones que interrumpen el flujo, como try/catch. Las trampas y otros mecanismos de excepción siguen siendo opcionales, como lo eran en IEEE 754-1985.
La cláusula 9 de la norma recomienda operaciones matemáticas adicionales [45] que las normas lingüísticas deberían definir. [46] No se requiere ninguna para cumplir con la norma.
Las siguientes son operaciones aritméticas recomendadas, que deben redondearse correctamente: [47]
Las funciones , y no formaban parte del estándar IEEE 754-2008 porque se consideraban menos necesarias. [49] y se mencionaron, pero esto se consideró un error. [5] Las tres se agregaron en la revisión de 2019.
Las operaciones recomendadas también incluyen la configuración y el acceso a la dirección de redondeo del modo dinámico, [50] y operaciones de reducción vectorial definidas por la implementación, como suma, producto escalado y producto escalar , cuya precisión no está especificada por el estándar. [51]
A partir de 2019 [update], también se recomiendan operaciones aritméticas aumentadas [52] para los formatos binarios. Estas operaciones, especificadas para la suma, la resta y la multiplicación, producen un par de valores que consisten en un resultado correctamente redondeado al más cercano en el formato y el término de error, que se puede representar exactamente en el formato. En el momento de la publicación de la norma, no se conocen implementaciones de hardware, pero ya se habían implementado operaciones muy similares en software utilizando algoritmos bien conocidos. La historia y la motivación para su estandarización se explican en un documento de referencia. [53] [54]
A partir de 2019, los valores minNum , maxNum , minNumMag y maxNumMag que antes se requerían en IEEE 754-2008 ahora están obsoletos debido a su falta de asociatividad . En su lugar, se recomiendan dos conjuntos de nuevas operaciones mínimas y máximas. [55] El primer conjunto contiene minimum , minimumNumber , maximum y maximumNumber . El segundo conjunto contiene minimumMagnitude , minimumMagnitudeNumber , maximumMagnitude y maximumMagnitudeNumber . La historia y la motivación de este cambio se explican en un documento de antecedentes. [56]
El estándar recomienda cómo los estándares de lenguaje deberían especificar la semántica de las secuencias de operaciones y señala las sutilezas de los significados literales y las optimizaciones que cambian el valor de un resultado. Por el contrario, la versión anterior de 1985 del estándar dejaba sin especificar aspectos de la interfaz del lenguaje, lo que conducía a un comportamiento inconsistente entre compiladores o a diferentes niveles de optimización en un compilador optimizador .
Los lenguajes de programación deberían permitir que el usuario especifique una precisión mínima para los cálculos intermedios de expresiones para cada base. Esto se conoce como preferenceWidth en el estándar y debería ser posible establecerlo por bloque. Los cálculos intermedios dentro de las expresiones deberían calcularse, y cualquier valor temporal guardado, utilizando el máximo del ancho de los operandos y el ancho preferido si está establecido. Así, por ejemplo, un compilador que apunta a hardware de punto flotante x87 debería tener un medio para especificar que los cálculos intermedios deben utilizar el formato de doble extensión . El valor almacenado de una variable siempre debe utilizarse al evaluar expresiones posteriores, en lugar de cualquier precursor anterior al redondeo y la asignación a la variable.
La versión IEEE 754-1985 del estándar permitía muchas variaciones en las implementaciones (como la codificación de algunos valores y la detección de ciertas excepciones). La IEEE 754-2008 ha reducido estas concesiones, pero aún quedan algunas variaciones (especialmente para formatos binarios). La cláusula de reproducibilidad recomienda que los estándares de lenguaje proporcionen un medio para escribir programas reproducibles (es decir, programas que produzcan el mismo resultado en todas las implementaciones de un lenguaje) y describe lo que se debe hacer para lograr resultados reproducibles.
La norma exige operaciones para convertir entre formatos básicos y formatos de secuencias de caracteres externos . [57] Se requieren conversiones hacia y desde un formato de caracteres decimales para todos los formatos. La conversión a una secuencia de caracteres externa debe ser tal que la conversión de vuelta usando el redondeo al número más cercano, los empates al número par, recupere el número original. No existe ningún requisito para preservar la carga útil de un NaN silencioso o un NaN de señalización, y la conversión desde la secuencia de caracteres externa puede convertir un NaN de señalización en un NaN silencioso.
El valor binario original se conservará al convertirlo a decimal y viceversa usando: [58]
Para otros formatos binarios, el número requerido de dígitos decimales es [h]
donde p es el número de bits significativos en el formato binario, por ejemplo, 237 bits para binario256.
Al utilizar un formato de punto flotante decimal, la representación decimal se conservará mediante:
Gay [59 ] analiza algoritmos, con código, para la conversión redondeada correcta de binario a decimal y de decimal a binario, y Paxson y Kahan [60] , para la prueba.
El estándar recomienda proporcionar conversiones hacia y desde secuencias de caracteres externos con significado hexadecimal , basándose en los literales de punto flotante hexadecimales de C99+
. Un literal de este tipo consta de un signo opcional ( o -
), el indicador "0x", un número hexadecimal con o sin punto, un indicador de exponente "p" y un exponente decimal con un signo opcional. La sintaxis no distingue entre mayúsculas y minúsculas. [61] El exponente decimal se escala en potencias de 2. Por ejemplo, 0x0.1p0
es 1/16 y 0x0.1p-4
es 1/256. [62]
Dado que las tasas de crecimiento no pueden ser inferiores a -1, dichas tasas indican excepciones no válidas.
{{cite book}}
: CS1 maint: numeric names: authors list (link){{cite book}}
: CS1 maint: numeric names: authors list (link)