De Wikipedia, la enciclopedia libre
  (Redirigido de la aritmética de precisión finita )
Saltar a navegación Saltar a búsqueda

Una de las primeras computadoras programables electromecánicas, la Z3 , incluía aritmética de punto flotante (réplica en exhibición en el Deutsches Museum de Múnich ).

En informática , la aritmética de punto flotante ( FP ) es aritmética que utiliza la representación de fórmulas de números reales como una aproximación para respaldar un compromiso entre rango y precisión. Por esta razón, el cálculo de punto flotante se usa a menudo en sistemas con números reales muy pequeños y muy grandes que requieren tiempos de procesamiento rápidos. En general, un número de coma flotante se representa aproximadamente con un número fijo de dígitos significativos (el significando ) y se escala usando un exponente en alguna base fija; la base para la escala es normalmente dos, diez o dieciséis. Un número que se puede representar exactamente tiene la siguiente forma:

donde significand es un número entero , base es un número entero mayor o igual a dos y exponente también es un número entero. Por ejemplo:

El término punto flotante se refiere al hecho de que el punto de base de un número ( punto decimal o, más comúnmente en las computadoras, punto binario ) puede "flotar"; es decir, se puede colocar en cualquier lugar relativo a los dígitos significativos del número. Esta posición se indica como el componente del exponente y, por lo tanto, la representación de punto flotante se puede considerar como una especie de notación científica .

Se puede utilizar un sistema de coma flotante para representar, con un número fijo de dígitos, números de diferentes órdenes de magnitud : por ejemplo, la distancia entre galaxias o el diámetro de un núcleo atómico se puede expresar con la misma unidad de longitud. El resultado de este rango dinámico es que los números que se pueden representar no están espaciados uniformemente; la diferencia entre dos números representables consecutivos varía con la escala elegida. [1]

Números de punto flotante de precisión simple en una recta numérica : las líneas verdes marcan valores representables.
Versión aumentada anterior que muestra ambos signos de valores representables

A lo largo de los años, se han utilizado en las computadoras una variedad de representaciones de punto flotante. En 1985, se estableció el estándar IEEE 754 para aritmética de punto flotante y, desde la década de 1990, las representaciones más comunes son las definidas por el IEEE.

La velocidad de las operaciones de punto flotante, comúnmente medida en términos de FLOPS , es una característica importante de un sistema informático , especialmente para aplicaciones que involucran cálculos matemáticos intensivos.

Una unidad de punto flotante (FPU, coloquialmente un coprocesador matemático ) es parte de un sistema informático especialmente diseñado para realizar operaciones con números de punto flotante.

Resumen [ editar ]

Números de coma flotante [ editar ]

Una representación numérica especifica alguna forma de codificar un número, generalmente como una cadena de dígitos.

Existen varios mecanismos mediante los cuales cadenas de dígitos pueden representar números. En la notación matemática común, la cadena de dígitos puede tener cualquier longitud, y la ubicación del punto de base se indica colocando un carácter de "punto" explícito (punto o coma) allí. Si no se especifica el punto de la base, la cadena representa implícitamente un número entero y el punto de la base no declarada estaría fuera del extremo derecho de la cadena, junto al dígito menos significativo. En los sistemas de punto fijo , se especifica una posición en la cadena para el punto de base. Entonces, un esquema de coma fija podría ser usar una cadena de 8 dígitos decimales con la coma decimal en el medio, donde "00012345" representaría 0001.2345.

En notación científica , el número dado se escala con una potencia de 10 , por lo que se encuentra dentro de un cierto rango, típicamente entre 1 y 10, con el punto de la raíz que aparece inmediatamente después del primer dígito. El factor de escala, como una potencia de diez, se indica por separado al final del número. Por ejemplo, el período orbital de la luna de Júpiter Io es152,853.5047 segundos, un valor que se representaría en notación científica de forma estándar como1.528535047 × 10 5 segundos.

La representación en coma flotante es similar en concepto a la notación científica. Lógicamente, un número de punto flotante consta de:

  • Una cadena de dígitos con signo (es decir, positivo o negativo) de una longitud determinada en una base (o raíz ) determinada. Esta cadena de dígitos se conoce como significando , mantisa o coeficiente . [nb 1] La longitud del significando determina la precisión con la que se pueden representar los números. Se asume que la posición del punto de la base siempre está en algún lugar dentro del significado, a menudo justo después o justo antes del dígito más significativo, oa la derecha del dígito más a la derecha (el menos significativo). Este artículo generalmente sigue la convención de que el punto de base se establece justo después del dígito más significativo (más a la izquierda).
  • Un exponente entero con signo (también denominado característica o escala ), [nb 2] que modifica la magnitud del número.

Para derivar el valor del número de punto flotante, el significando se multiplica por la base elevada a la potencia del exponente , lo que equivale a desplazar el punto de la base de su posición implícita por un número de lugares igual al valor del exponente, a a la derecha si el exponente es positivo oa la izquierda si el exponente es negativo.

Usando base-10 (la notación decimal familiar ) como ejemplo, el número152,853.5047 , que tiene diez dígitos decimales de precisión, se representa como el significado1,528,535,047 junto con 5 como exponente. Para determinar el valor real, se coloca un punto decimal después del primer dígito del significado y el resultado se multiplica por 10 5 para obtener1.528535047 × 10 5 , o152.853,5047 . Al almacenar tal número, no es necesario almacenar la base (10), ya que será la misma para todo el rango de números admitidos y, por lo tanto, se puede inferir.

Simbólicamente, este valor final es:

donde s es el significando (ignorando cualquier punto decimal implícito), p es la precisión (el número de dígitos en el significando), b es la base (en nuestro ejemplo, este es el número diez ) y e es el exponente.

Históricamente, se han utilizado varias bases numéricas para representar números de coma flotante, siendo la base dos ( binaria ) la más común, seguida de la base diez ( coma flotante decimal ) y otras variedades menos comunes, como la base dieciséis ( coma flotante hexadecimal). [2] [3] [nb 3] ), base ocho (punto flotante octal [4] [3] [5] [2] [nb 4] ), base cuatro (punto flotante cuaternario [6] [3] [nb 5] ), base tres ( punto flotante ternario balanceado [4] ) e incluso base 256 [3] [nb 6] y base65.536 . [7] [nb 7]

Un número de coma flotante es un número racional , porque se puede representar como un número entero dividido por otro; por ejemplo1,45 × 10 3 es (145/100) × 1000 o145.000 / 100. La base determina las fracciones que se pueden representar; por ejemplo, 1/5 no se puede representar exactamente como un número de punto flotante usando una base binaria, pero 1/5 se puede representar exactamente usando una base decimal (0.2 , o2 × 10 −1 ). Sin embargo, 1/3 no puede ser representado exactamente por binario (0.010101 ...) o decimal (0.333 ...), pero en base 3 , es trivial (0.1 o 1 × 3 −1 ). Las ocasiones en las que se producen infinitas expansiones dependen de la base y sus factores primos .

La forma en que el significado (incluido su signo) y el exponente se almacenan en una computadora depende de la implementación. Los formatos IEEE comunes se describen en detalle más adelante y en otros lugares, pero como ejemplo, en la representación binaria de punto flotante de precisión simple (32 bits) , por lo que el significado es una cadena de 24 bits . Por ejemplo, los primeros 33 bits del número π son:

En esta expansión binaria, denotemos las posiciones desde 0 (bit más a la izquierda, o bit más significativo) a 32 (bit más a la derecha). El significado de 24 bits se detendrá en la posición 23, que se muestra como el bit subrayado0 arriba. El siguiente bit, en la posición 24, se denomina bit de redondeo o bit de redondeo . Se utiliza para redondear la aproximación de 33 bits al número de 24 bits más cercano (existen reglas específicas para los valores intermedios , que no es el caso aquí). Este bit, que es1 en este ejemplo, se suma al número entero formado por los 24 bits más a la izquierda, dando como resultado:

Cuando esto se almacena en la memoria usando la codificación IEEE 754, esto se convierte en el significado s . Se supone que el significado tiene un punto binario a la derecha del bit más a la izquierda. Entonces, la representación binaria de π se calcula de izquierda a derecha de la siguiente manera:

donde p es la precisión (24 en este ejemplo), n es la posición del bit del significando desde la izquierda (comenzando en0 y terminando en23 aquí) ye es el exponente (1 en este ejemplo).

Puede requerirse que el dígito más significativo del significado de un número distinto de cero sea distinto de cero (excepto cuando el exponente correspondiente sea menor que el mínimo). Este proceso se llama normalización . Para formatos binarios (que usa solo los dígitos0 y1 ), este dígito distinto de cero es necesariamente1 . Por lo tanto, no es necesario que esté representado en la memoria; permitiendo que el formato tenga un poco más de precisión. Esta regla se denomina de forma diversa convención de bits iniciales , convención de bits implícita , convención de bits ocultos , [4] o convención de bits asumida .

Alternativas a los números de punto flotante [ editar ]

La representación de punto flotante es, con mucho, la forma más común de representar en computadoras una aproximación a números reales. Sin embargo, existen alternativas:

  • La representación de punto fijo utiliza operaciones de hardware enteras controladas por una implementación de software de una convención específica sobre la ubicación del punto binario o decimal, por ejemplo, 6 bits o dígitos desde la derecha. El hardware para manipular estas representaciones es menos costoso que el punto flotante y también se puede utilizar para realizar operaciones normales con enteros. El punto fijo binario se usa generalmente en aplicaciones de propósito especial en procesadores integrados que solo pueden hacer aritmética de números enteros, pero el punto fijo decimal es común en aplicaciones comerciales.
  • Los sistemas de números logarítmicos (LNS) representan un número real por el logaritmo de su valor absoluto y un bit de signo. La distribución del valor es similar al punto flotante, pero la curva valor-representación ( es decir , el gráfico de la función logarítmica) es suave (excepto en 0). A la inversa de la aritmética de punto flotante, en un sistema numérico logarítmico la multiplicación, la división y la exponenciación son sencillas de implementar, pero la suma y la resta son complejas. La aritmética ( simétrica ) de índice de nivel (LI y SLI) de Charles Clenshaw, Frank Olver y Peter Turner es un esquema basado en una representación logarítmica generalizada .
  • Representación cónica de punto flotante , que no parece utilizarse en la práctica.
  • Cuando se desea una mayor precisión, se puede implementar aritmética de punto flotante (generalmente en software) con significados de longitud variable (y a veces exponentes) que se dimensionan según la necesidad real y según cómo proceda el cálculo. Esto se llama aritmética de punto flotante de precisión arbitraria .
  • Las expansiones de punto flotante son otra forma de obtener una mayor precisión, beneficiándose del hardware de punto flotante: un número se representa como una suma no evaluada de varios números de punto flotante. Un ejemplo es doble-doble aritmética , a veces se utiliza para el tipo C long double.
  • Algunos números racionales simples ( por ejemplo , 1/3 y 1/10) no se pueden representar exactamente en coma flotante binaria, sin importar cuál sea la precisión. El uso de una base diferente permite representar algunos de ellos ( por ejemplo , 1/10 en coma flotante decimal), pero las posibilidades siguen siendo limitadas. Los paquetes de software que realizan aritmética racional representan números como fracciones con numerador y denominador integrales y, por lo tanto, pueden representar exactamente cualquier número racional. Estos paquetes generalmente necesitan usar aritmética " bignum " para los enteros individuales.
  • La aritmética de intervalos permite representar números como intervalos y obtener límites garantizados en los resultados. Generalmente se basa en otras aritméticas, en particular en coma flotante.
  • Los sistemas de álgebra computarizada como Mathematica , Maxima y Maple a menudo pueden manejar números irracionales como o de una manera completamente "formal", sin lidiar con una codificación específica del significado. Dicho programa puede evaluar expresiones como " " exactamente, porque está programado para procesar las matemáticas subyacentes directamente, en lugar de utilizar valores aproximados para cada cálculo intermedio.

Historia [ editar ]

En 1914, Leonardo Torres Quevedo diseñó un electromecánico versión de Charles Babbage 's máquina analítica , e incluía aritmética de punto flotante. [8] En 1938, Konrad Zuse de Berlín completó el Z1 , el primer ordenador mecánico programable binario ; [9] utiliza una representación numérica de punto flotante binario de 24 bits con un exponente con signo de 7 bits, un significado de 17 bits (incluido un bit implícito) y un bit de signo. [10] El Z3 basado en relés más confiable, terminado en 1941, tiene representaciones de infinitos tanto positivos como negativos; en particular, implementa operaciones definidas con infinito, como , y se detiene en operaciones no definidas, como .

Konrad Zuse , arquitecto de la computadora Z3 , que utiliza una representación binaria de punto flotante de 22 bits.

Zuse también propuso, pero no completó, una aritmética de punto flotante cuidadosamente redondeada que incluye y representaciones NaN, anticipando las características del estándar IEEE por cuatro décadas. [11] En contraste, von Neumann recomendó contra los números de punto flotante para la máquina IAS de 1951 , argumentando que es preferible la aritmética de punto fijo. [11]

La primera computadora comercial con hardware de punto flotante fue la computadora Z4 de Zuse , diseñada en 1942-1945. En 1946, Bell Laboratories introdujo el Mark V, que implementó números de coma flotante decimal . [12]

El Pilot ACE tiene aritmética de coma flotante binaria y entró en funcionamiento en 1950 en el Laboratorio Nacional de Física, Reino Unido . Más tarde, treinta y tres se vendieron comercialmente como el DEUCE eléctrico inglés . La aritmética se implementa en realidad en el software, pero con una frecuencia de reloj de un megahercio, la velocidad de las operaciones de coma flotante y de coma fija en esta máquina era inicialmente más rápida que la de muchas computadoras de la competencia.

El IBM 704 de producción masiva siguió en 1954; introdujo el uso de un exponente sesgado . Durante muchas décadas después de eso, el hardware de punto flotante era típicamente una característica opcional, y se decía que las computadoras que lo tenían eran "computadoras científicas", o tenían capacidad de " computación científica " (SC) (ver también Extensiones para Computación Científica (XSC) )). No fue hasta el lanzamiento de Intel i486 en 1989 que las computadoras personales de uso general tenían la capacidad de punto flotante en el hardware como característica estándar.

La serie UNIVAC 1100/2200 , introducida en 1962, admitía dos representaciones de punto flotante:

  • Precisión simple : 36 bits, organizados como un signo de 1 bit, un exponente de 8 bits y un significado de 27 bits.
  • Precisión doble : 72 bits, organizados como un signo de 1 bit, un exponente de 11 bits y un significado de 60 bits.

El IBM 7094 , también introducido en 1962, admite representaciones de precisión simple y doble precisión, pero sin relación con las representaciones de UNIVAC. De hecho, en 1964, IBM introdujo representaciones hexadecimales de punto flotante en sus mainframes System / 360 ; estas mismas representaciones todavía están disponibles para su uso en sistemas modernos de z / Architecture . Sin embargo, en 1998, IBM incluyó aritmética de coma flotante binaria compatible con IEEE en sus mainframes; en 2005, IBM también agregó aritmética de coma flotante decimal compatible con IEEE.

Inicialmente, las computadoras usaban muchas representaciones diferentes para números de punto flotante. La falta de estandarización a nivel de mainframe era un problema constante a principios de la década de 1970 para quienes escribían y mantenían código fuente de alto nivel; estos estándares de punto flotante del fabricante diferían en el tamaño de las palabras, las representaciones y el comportamiento de redondeo y la precisión general de las operaciones. La compatibilidad de punto flotante en múltiples sistemas informáticos necesitaba desesperadamente una estandarización a principios de la década de 1980, lo que llevó a la creación del estándar IEEE 754 una vez que la palabra de 32 bits (o 64 bits) se había convertido en algo común. Este estándar se basó significativamente en una propuesta de Intel, que estaba diseñando el i8087coprocesador numérico; Motorola, que estaba diseñando el 68000 casi al mismo tiempo, también hizo una aportación significativa.

En 1989, el matemático e informático William Kahan fue galardonado con el Premio Turing por ser el arquitecto principal detrás de esta propuesta; fue ayudado por su alumno (Jerome Coonen) y un profesor invitado (Harold Stone). [13]

Entre las innovaciones x86 se encuentran estas:

  • Una representación de punto flotante especificada con precisión a nivel de cadena de bits, de modo que todas las computadoras compatibles interpreten los patrones de bits de la misma manera. Esto hace posible transferir con precisión y eficiencia números de punto flotante de una computadora a otra (después de tener en cuenta la endianidad ).
  • Un comportamiento especificado con precisión para las operaciones aritméticas: se requiere que se produzca un resultado como si se usara aritmética infinitamente precisa para producir un valor que luego se redondea de acuerdo con reglas específicas. Esto significa que un programa de computadora compatible siempre produciría el mismo resultado cuando se le diera una entrada en particular, mitigando así la reputación casi mística que la computación de punto flotante había desarrollado por su comportamiento aparentemente no determinista.
  • La capacidad de condiciones excepcionales (desbordamiento, división por cero , etc.) de propagarse a través de un cálculo de manera benigna y luego ser manejadas por el software de manera controlada.

Rango de números de punto flotante [ editar ]

Un número de coma flotante consta de dos componentes de coma fija , cuyo rango depende exclusivamente del número de bits o dígitos en su representación. Mientras que los componentes dependen linealmente de su rango, el rango de punto flotante depende linealmente del rango significativo y exponencialmente del rango del componente exponente, que le da un rango notablemente más amplio al número.

En un sistema informático típico, un número de coma flotante binario de doble precisión (64 bits) tiene un coeficiente de 53 bits (incluido 1 bit implícito), un exponente de 11 bits y 1 bit de signo. Dado que 2 10 = 1024, el rango completo de los números de coma flotante normales positivos en este formato es de 2 −1022  ≈ 2 × 10 −308 a aproximadamente 2 1024  ≈ 2 × 10 308 .

El número de números de coma flotante normalizados en un sistema ( B , P , L , U ) donde

  • B es la base del sistema,
  • P es la precisión del significando (en base B ),
  • L es el exponente más pequeño del sistema,
  • U es el mayor exponente del sistema,

es .

Hay un número de punto flotante normalizado positivo más pequeño,

Nivel de subdesbordamiento = UFL = ,

que tiene un 1 como dígito inicial y 0 para los dígitos restantes del significando, y el valor más pequeño posible para el exponente.

Hay un número de coma flotante más grande,

Nivel de desbordamiento = OFL = ,

que tiene B - 1 como valor para cada dígito del significando y el mayor valor posible para el exponente.

Además, existen valores representables estrictamente entre −UFL y UFL. Es decir, ceros positivos y negativos , así como números desnormalizados .

IEEE 754: punto flotante en computadoras modernas [ editar ]

El IEEE estandarizó la representación por computadora para números binarios de punto flotante en IEEE 754 (también conocido como IEC 60559) en 1985. Este primer estándar es seguido por casi todas las máquinas modernas. Fue revisado en 2008 . Los mainframes de IBM admiten el formato de punto flotante hexadecimal propio de IBM y el punto flotante decimal IEEE 754-2008, además del formato binario IEEE 754. La serie Cray T90 tenía una versión IEEE, pero el SV1 todavía usa el formato de punto flotante Cray. [ cita requerida ]

El estándar proporciona muchos formatos estrechamente relacionados, que se diferencian solo en unos pocos detalles. Cinco de estos formatos se denominan formatos básicos y otros se denominan formatos de precisión extendida y formato de precisión extensible . Hay tres formatos que se utilizan especialmente en hardware e idiomas informáticos: [ cita requerida ]

  • Precisión simple (binary32), generalmente utilizado para representar el tipo "flotante" en la familia de lenguajes C (aunque esto no está garantizado ). Este es un formato binario que ocupa 32 bits (4 bytes) y su significado tiene una precisión de 24 bits (alrededor de 7 dígitos decimales).
  • Precisión doble (binary64), generalmente utilizado para representar el tipo "doble" en la familia de lenguajes C (aunque esto no está garantizado ). Este es un formato binario que ocupa 64 bits (8 bytes) y su significado tiene una precisión de 53 bits (alrededor de 16 dígitos decimales).
  • Formato doble extendido , también llamado ambiguamente "precisión extendida". Este es un formato binario que ocupa al menos 79 bits (80 si no se usa la regla de bit oculto / implícito) y su significado tiene una precisión de al menos 64 bits (aproximadamente 19 dígitos decimales). Los estándares C99 y C11 de la familia de lenguajes C, en su anexo F ("aritmética de coma flotante IEC 60559"), recomiendan que este formato extendido se proporcione como " doble largo ". [14] El formato x86 proporciona un formato que satisface los requisitos mínimos (precisión significativa de 64 bits, exponente de 15 bits, por lo que se ajusta a 80 bits)arquitectura. A menudo, en estos procesadores, este formato se puede utilizar con "doble largo", aunque la precisión ampliada no está disponible con MSVC. Para propósitos de alineación , muchas herramientas almacenan este valor de 80 bits en un espacio de 96 o 128 bits. [15] [16] En otros procesadores, "doble largo" puede significar un formato más grande, como precisión cuádruple, [17] o simplemente precisión doble, si no se dispone de alguna forma de precisión extendida. [18]

El aumento de la precisión de la representación de punto flotante generalmente reduce la cantidad de error de redondeo acumulado causado por los cálculos intermedios. [19] Los formatos IEEE menos comunes incluyen:

  • Precisión cuádruple (binary128). Este es un formato binario que ocupa 128 bits (16 bytes) y su significado tiene una precisión de 113 bits (alrededor de 34 dígitos decimales).
  • Formatos de coma flotante decimal64 y decimal128 . Estos formatos, junto con el formato decimal32 , están pensados ​​para realizar correctamente el redondeo decimal.
  • Media precisión , también llamada binary16, un valor de punto flotante de 16 bits. Se utiliza en el lenguaje de gráficos NVIDIA Cg y en el estándar openEXR. [20]

Cualquier entero con valor absoluto menor que 2 24 se puede representar exactamente en el formato de precisión simple, y cualquier entero con valor absoluto menor que 2 53 se puede representar exactamente en el formato de precisión doble. Además, se puede representar una amplia gama de potencias de 2 veces ese número. Estas propiedades a veces se usan para datos puramente enteros, para obtener enteros de 53 bits en plataformas que tienen flotantes de doble precisión pero solo enteros de 32 bits.

El estándar especifica algunos valores especiales y su representación: infinito positivo (+ ∞), infinito negativo (−∞), un cero negativo (−0) distinto del cero ordinario ("positivo") y valores "no es un número" ( NaNs ).

La comparación de números de punto flotante, según la definición del estándar IEEE, es un poco diferente de la comparación de enteros habitual. El cero negativo y el positivo se comparan igual, y cada NaN se compara de forma desigual con todos los valores, incluido él mismo. Todos los valores excepto NaN son estrictamente menores que + ∞ y estrictamente mayores que −∞. Los números de coma flotante finitos se ordenan de la misma manera que sus valores (en el conjunto de números reales).

Representación interna [ editar ]

Los números de coma flotante normalmente se empaquetan en un dato de computadora como el bit de signo, el campo de exponente y el significado o mantisa, de izquierda a derecha. Para los formatos binarios IEEE 754 (básico y extendido) que tienen implementaciones de hardware existentes, se distribuyen de la siguiente manera:

Si bien el exponente puede ser positivo o negativo, en formatos binarios se almacena como un número sin signo al que se le agrega un "sesgo" fijo. Los valores de todos los 0 en este campo están reservados para los ceros y los números subnormales ; los valores de todos los 1 se reservan para los infinitos y los NaN. El rango de exponentes para números normalizados es [−126, 127] para precisión simple, [−1022, 1023] para doble o [−16382, 16383] para cuádruple. Los números normalizados excluyen valores subnormales, ceros, infinitos y NaN.

En los formatos de intercambio binario IEEE, el bit inicial de un significado normalizado no se almacena realmente en el dato de la computadora. Se llama bit "oculto" o "implícito". Debido a esto, el formato de precisión simple en realidad tiene un significado con 24 bits de precisión, el formato de precisión doble tiene 53 y el cuádruple tiene 113.

Por ejemplo, se mostró arriba que π, redondeado a 24 bits de precisión, tiene:

  • signo = 0; e = 1; s = 110010010000111111011011 (incluido el bit oculto)

La suma del sesgo del exponente (127) y el exponente (1) es 128, por lo que se representa en formato de precisión simple como

  • 0 10000000 10010010000111111011011 (excluyendo el bit oculto) = 40490FDB [21] como número hexadecimal .

Un ejemplo de diseño para coma flotante de 32 bits es

y el diseño de 64 bits es similar .

Valores especiales [ editar ]

Firmado cero [ editar ]

En el estándar IEEE 754, el cero está firmado, lo que significa que existen tanto un "cero positivo" (+0) como un "cero negativo" (−0). En la mayoría de los entornos de tiempo de ejecución , el cero positivo generalmente se imprime 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 +0 y −0 de manera diferente incluyen log ( x ), signum ( x ),y + xi para cualquier número negativo y . Como ocurre 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 . [22]

Números anormales [ editar ]

Los valores subnormales llenan el espacio de subdesbordamiento con valores donde la distancia absoluta entre ellos es la misma que para los valores adyacentes justo fuera del espacio de subdesbordamiento. Esta es una mejora con respecto a la práctica anterior de simplemente tener cero en la brecha de subdesbordamiento, y donde los resultados de subdesbordamiento se reemplazaron por cero (nivelado a cero). [4]

El hardware moderno de punto flotante generalmente maneja valores subnormales (así como valores normales) y no requiere emulación de software para subnormales.

Infinitos [ editar ]

Los infinitos de la recta numérica real 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 (pero no siempre, ya que depende del redondeo) utilizados como valores de reemplazo cuando hay un desbordamiento. Tras una excepción de división por cero, se devuelve un infinito positivo o negativo como resultado exacto. También se puede introducir un infinito como un número (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

  • (+ ∞) + (+7) = (+ ∞)
  • (+ ∞) × (−2) = (−∞)
  • (+ ∞) × 0 = NaN - no hay nada significativo que hacer

NaNs [ editar ]

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. No Hay dos tipos de NaN: los NaN silenciosos predeterminados y, opcionalmente, los NaN de señalización . Una señalización NaN en cualquier operación aritmética (incluidas las comparaciones numéricas) provocará la señalización de una excepción de "operación no válida" .

La representación de NaN especificada por el estándar tiene algunos bits no especificados que podrían usarse para codificar el tipo o la fuente del error; pero no existe un estándar para esa codificación. En teoría, los NaN de señalización podrían ser utilizados por un sistema de tiempo de ejecución para marcar variables no inicializadas, o extender los números de punto flotante con otros valores especiales sin ralentizar los cálculos con valores ordinarios, aunque tales extensiones no son comunes.

Justificación del diseño IEEE 754 [ editar ]

William Kahan . Arquitecto principal del coprocesador de punto flotante Intel 80x87 y del estándar de punto flotante IEEE 754 .

Es un error común pensar que las características más esotéricas del estándar IEEE 754 discutidas aquí, como los formatos extendidos, NaN, infinitos, subnormales, etc., son solo de interés para los analistas numéricos o para aplicaciones numéricas avanzadas; de hecho, ocurre lo contrario: estas características están diseñadas para ofrecer valores predeterminados seguros y robustos para programadores no sofisticados numéricamente, además de admitir bibliotecas numéricas sofisticadas por parte de expertos. El diseñador clave de IEEE 754, William Kahanseñala que es incorrecto "... [considerar] características de la Norma IEEE 754 para aritmética de coma flotante binaria que ... [no] se aprecian como características utilizables únicamente por expertos numéricos. Los hechos son todo lo contrario. En 1977, esas características se diseñaron en Intel 8087 para servir al mercado más amplio posible ... El análisis de errores nos dice cómo diseñar aritmética de punto flotante, como el estándar IEEE 754, moderadamente tolerante con la ignorancia bien intencionada entre los programadores ". [23]

  • Los valores especiales como infinito y NaN aseguran que la aritmética de punto flotante se complete algebraicamente, de modo que cada operación de punto flotante produzca un resultado bien definido y no arroje, por defecto, una interrupción o trampa de la máquina. Además, las opciones de valores especiales devueltos en casos excepcionales se diseñaron para dar la respuesta correcta en muchos casos, por ejemplo, fracciones continuas como R (z): = 7 - 3 / [z - 2 - 1 / (z - 7 + 10 / [z - 2 - 2 / (z - 3)])] dará la respuesta correcta en todas las entradas según la aritmética IEEE 754, ya que la división potencial por cero en, por ejemplo, R (3) = 4.6 se maneja correctamente como + infinito, por lo que puede ignorarse con seguridad. [24] Como señaló Kahan, la trampa no controlada consecutiva a un desbordamiento de conversión de punto flotante a entero de 16 bits que causó la pérdida de un Ariane 5cohete no habría sucedido bajo la política de punto flotante IEEE 754 predeterminada. [23]
  • Los números subnormales aseguran que para los números finitos de coma flotante xey, x - y = 0 si y solo si x = y, como se esperaba, pero que no se mantuvo bajo representaciones de coma flotante anteriores. [13]
  • Sobre el fundamento del diseño del formato x87 de 80 bits , Kahan señala: "Este formato extendido está diseñado para usarse, con una pérdida de velocidad insignificante, para todas las aritméticas, excepto la más simple, con operandos flotantes y dobles. Por ejemplo, debe usarse para variables scratch en bucles que implementan recurrencias como evaluación polinomial, productos escalares, fracciones parciales y continuas. A menudo evita Over / Underflow prematuro o cancelación local severa que puede estropear algoritmos simples ". [25] El cálculo de resultados intermedios en un formato extendido con alta precisión y exponente extendido tiene precedentes en la práctica histórica del cálculo científico y en el diseño de calculadoras científicas, por ejemplo, de Hewlett-Packard .las calculadoras financieras realizaban funciones aritméticas y financieras con tres decimales más significativos de los que almacenaban o mostraban. [25] La implementación de precisión extendida permitió desarrollar fácilmente bibliotecas de funciones elementales estándar que normalmente daban resultados de doble precisión dentro de una unidad en último lugar (ULP) a alta velocidad.
  • El redondeo correcto de los valores al valor representable más cercano evita sesgos sistemáticos en los cálculos y ralentiza el crecimiento de los errores. Redondear los vínculos a pares elimina el sesgo estadístico que puede ocurrir al agregar cifras similares.
  • El redondeo dirigido fue pensado como una ayuda para verificar los límites de error, por ejemplo, en aritmética de intervalos. También se utiliza en la implementación de algunas funciones.
  • La base matemática de las operaciones permitió construir con relativa facilidad subrutinas aritméticas de palabras múltiples de alta precisión.

Una propiedad de los formatos de precisión simple y doble es que son fáciles de clasificar sin utilizar hardware de punto flotante. Sus bits interpretados como un entero en complemento a dos ya clasifican los positivos correctamente, con los negativos invertidos. Con una xor para invertir el bit de signo para valores positivos y todos los bits para valores negativos, todos los valores se pueden ordenar como enteros sin signo (con −0 <+0 ). [26] No está claro si esta propiedad está destinada.

Otros formatos de coma flotante notables [ editar ]

Además de los formatos estándar IEEE 754 ampliamente utilizados , se utilizan, o se han utilizado, otros formatos de punto flotante en determinadas áreas específicas del dominio.

  • El formato Bfloat16 requiere la misma cantidad de memoria (16 bits) que el formato de precisión media IEEE 754 , pero asigna 8 bits al exponente en lugar de 5, lo que proporciona el mismo rango que un número IEEE 754 de precisión simple . La compensación es una precisión reducida, ya que el campo significativo se reduce de 10 a 7 bits. Este formato se utiliza principalmente en el entrenamiento de modelos de aprendizaje automático , donde el rango es más valioso que la precisión. Muchos aceleradores de aprendizaje automático brindan soporte de hardware para este formato.
  • El formato TensorFloat-32 [27] proporciona lo mejor de los formatos Bfloat16 y de precisión media, con 8 bits de exponente como el primero y 10 bits de campo significativo como el último. Este formato fue introducido por Nvidia , que proporciona soporte de hardware en los núcleos Tensor de sus GPU basados ​​en la arquitectura Nvidia Ampere. El inconveniente de este formato es su tamaño total de 19 bits, que no es una potencia de 2. Sin embargo, según Nvidia, este formato solo debe ser utilizado internamente por hardware para acelerar los cálculos, mientras que las entradas y salidas deben almacenarse en el Formato IEEE 754 de precisión simple de 32 bits. [27]

Números representables, conversión y redondeo [ editar ]

Por su naturaleza, todos los números expresados ​​en formato de punto flotante son números racionales con una expansión de terminación en la base relevante (por ejemplo, una expansión decimal de terminación en base 10 o una expansión binaria de terminación en base 2). Los números irracionales, como π o √2, o los números racionales no terminales, deben aproximarse. El número de dígitos (o bits) de precisión también limita el conjunto de números racionales que se pueden representar con exactitud. Por ejemplo, el número decimal 123456789 no se puede representar exactamente si solo están disponibles ocho dígitos decimales de precisión (se redondearía a 123456790 o 123456780 donde el dígito 0 situado más a la derecha no se representa explícitamente), lo mismo se aplica a los dígitos no terminales (. 5 para redondear a .55555555 o .55555556).

Cuando un número se representa en algún formato (como una cadena de caracteres) que no es una representación nativa de punto flotante compatible con una implementación de computadora, entonces requerirá una conversión antes de que pueda usarse en esa implementación. Si el número se puede representar exactamente en formato de punto flotante, la conversión es exacta. Si no hay una representación exacta, la conversión requiere la elección del número de punto flotante que se utilizará para representar el valor original. La representación elegida tendrá un valor diferente al original, y el valor así ajustado se denomina valor redondeado .

El hecho de que un número racional tenga o no una expansión terminal depende de la base. Por ejemplo, en base 10, el número 1/2 tiene una expansión de terminación (0.5) mientras que el número 1/3 no (0.333 ...). En base-2, solo terminan los racionales con denominadores que son potencias de 2 (como 1/2 o 3/16). Cualquier racional con un denominador que tenga un factor primo distinto de 2 tendrá una expansión binaria infinita. Esto significa que los números que parecen ser cortos y exactos cuando se escriben en formato decimal pueden necesitar una aproximación cuando se convierten a coma flotante binaria. Por ejemplo, el número decimal 0.1 no es representable en coma flotante binaria de precisión finita; la representación binaria exacta tendría una secuencia "1100" continuando sin fin:

e = −4; s = 1100110011001100110011001100110011 ...,

donde, como antes, s es el significando ye es el exponente.

Cuando se redondea a 24 bits, se convierte en

e = −4; s = 110011001100110011001101,

que en realidad es 0.100000001490116119384765625 en decimal.

Como otro ejemplo, el número real π , representado en binario como una secuencia infinita de bits es

11,0010010000111111011010101000100010000101101000110000100011010011 ...

pero es

11.0010010000111111011011

cuando se aproxima redondeando a una precisión de 24 bits.

En coma flotante de precisión simple binaria, esto se representa como s  = 1.10010010000111111011011 con e  = 1. Esto tiene un valor decimal de

3.141592 7410125732421875,

mientras que una aproximación más precisa del verdadero valor de π es

3.14159265358979323846264338327950 ...

El resultado del redondeo difiere del valor real en aproximadamente 0,03 partes por millón y coincide con la representación decimal de π en los primeros 7 dígitos. La diferencia es el error de discretización y está limitada por el épsilon de la máquina .

La diferencia aritmética entre dos números de coma flotante representables consecutivos que tienen el mismo exponente se denomina unidad en último lugar (ULP). Por ejemplo, si no hay un número representable entre los números representables 1.45a70c22 hexadecimal y 1.45a70c24 hexadecimal , el ULP es 2 × 16 −8 o 2 −31 . Para números con una parte exponente de base 2 de 0, es decir, números con un valor absoluto superior o igual a 1 pero inferior a 2, un ULP es exactamente 2 −23 o aproximadamente 10 −7 en precisión simple, y exactamente 2 −53 o alrededor de 10-16en doble precisión. El comportamiento obligatorio del hardware compatible con IEEE es que el resultado esté dentro de la mitad de un ULP.

Modos de redondeo [ editar ]

El redondeo se utiliza cuando el resultado exacto de una operación de punto flotante (o una conversión a formato de punto flotante) necesitaría más dígitos que dígitos en el significado. IEEE 754 requiere un redondeo correcto : es decir, el resultado redondeado es como si se usara aritmética infinitamente precisa para calcular el valor y luego se redondeara (aunque en la implementación solo se necesitan tres bits adicionales para asegurar esto). Hay varios esquemas de redondeo diferentes (o modos de redondeo ). Históricamente, el truncamiento fue el enfoque típico. Desde la introducción de IEEE 754, el método predeterminado ( redondear al más cercano, se vincula a pares, a veces llamado redondeo bancario) se usa más comúnmente. Este método redondea el resultado ideal (infinitamente preciso) de una operación aritmética al valor representable más cercano y da esa representación como resultado. [nb 8] En caso de empate, se elige el valor que haría que el significado terminara en un dígito par. El estándar IEEE 754 requiere que se aplique el mismo redondeo a todas las operaciones algebraicas fundamentales, incluidas la raíz cuadrada y las conversiones, cuando hay un resultado numérico (no NaN). Significa que los resultados de las operaciones IEEE 754 están completamente determinados en todos los bits del resultado, excepto en la representación de NaN. (Las funciones de "biblioteca" como el coseno y el registro no son obligatorias).

También se encuentran disponibles opciones de redondeo alternativas. IEEE 754 especifica los siguientes modos de redondeo:

  • redondear al más cercano, donde los empates redondean al dígito par más cercano en la posición requerida (el modo predeterminado y, con mucho, el más común)
  • redondear al más cercano, donde los empates se redondean desde cero (opcional para coma flotante binaria y comúnmente usado en decimal)
  • redondear hacia arriba (hacia + ∞; los resultados negativos, por lo tanto, redondean hacia cero)
  • redondear hacia abajo (hacia −∞; los resultados negativos, por lo tanto, redondear desde cero)
  • redondear hacia cero (truncamiento; es similar al comportamiento común de las conversiones de flotante a entero, que convierten −3,9 en −3 y 3,9 en 3)

Los modos alternativos son útiles cuando la cantidad de error que se introduce debe estar acotada. Las aplicaciones que requieren un error acotado son el punto flotante de precisión múltiple y la aritmética de intervalos . Los modos de redondeo alternativos también son útiles para diagnosticar la inestabilidad numérica: si los resultados de una subrutina varían sustancialmente entre el redondeo a + y - infinito, es probable que sea numéricamente inestable y se vea afectado por un error de redondeo. [28]

Conversión de binario a decimal [ editar ]

Convertir un número de coma flotante binario de doble precisión en una cadena decimal es una operación común, pero un algoritmo que produce resultados precisos y mínimos no apareció impreso hasta 1990, con Steele y White's Dragon4. Algunas de las mejoras desde entonces incluyen:

  • Dtoa.c de David M. Gay , una implementación práctica de código abierto de muchas ideas en Dragon4. También incluye un analizador para cadenas decimales.
  • Grisu3, con una aceleración 4 × ya que elimina el uso de bignums . Debe usarse con una alternativa, ya que falla en ~ 0.5% de los casos. [29]
  • Errol3, un algoritmo siempre exitoso similar a Grisu3, pero más lento. Aparentemente no es tan bueno como un Grisu que termina anticipadamente con un respaldo. [30]
  • Ryū, un algoritmo siempre exitoso que es más rápido y más simple que Grisu3. [31]

Muchos tiempos de ejecución de lenguajes modernos usan Grisu3 con un respaldo de Dragon4. [32]

Operaciones aritméticas de coma flotante [ editar ]

Para facilitar la presentación y la comprensión, en los ejemplos se utilizará una base decimal con precisión de 7 dígitos, como en el formato IEEE 754 decimal32 . Los principios fundamentales son los mismos en cualquier base o precisión, excepto que la normalización es opcional (no afecta el valor numérico del resultado). Aquí, s denota el significado ye denota el exponente.

Suma y resta [ editar ]

Un método simple para sumar números de punto flotante es primero representarlos con el mismo exponente. En el siguiente ejemplo, el segundo número se desplaza a la derecha en tres dígitos y luego se procede con el método de suma habitual:

 123456.7 = 1.234567 × 10 ^ 5 101.7654 = 1.017654 × 10 ^ 2 = 0.001017654 × 10 ^ 5
 Por eso: 123456.7 + 101.7654 = (1.234567 × 10 ^ 5) + (1.017654 × 10 ^ 2) = (1.234567 × 10 ^ 5) + (0.001017654 × 10 ^ 5) = (1,234567 + 0,001017654) × 10 ^ 5 = 1,235584654 × 10 ^ 5

En detalle:

 e = 5; s = 1,234567 (123456,7)+ e = 2; s = 1.017654 (101.7654)
 e = 5; s = 1,234567+ e = 5; s = 0,001017654 (después del cambio)-------------------- e = 5; s = 1.235584654 (suma verdadera: 123558.4654)

Este es el resultado verdadero, la suma exacta de los operandos. Se redondeará a siete dígitos y luego se normalizará si es necesario. El resultado final es

 e = 5; s = 1.235585 (suma final: 123558.5)

Los tres dígitos más bajos del segundo operando (654) se pierden esencialmente. Este es un error de redondeo . En casos extremos, la suma de dos números distintos de cero puede ser igual a uno de ellos:

 e = 5; s = 1,234567+ e = −3; s = 9,876543
 e = 5; s = 1,234567+ e = 5; s = 0,00000009876543 (después del cambio)---------------------- e = 5; s = 1.23456709876543 (suma verdadera) e = 5; s = 1.234567 (después de redondeo y normalización)

En los ejemplos conceptuales anteriores, parecería que el sumador necesitaría proporcionar una gran cantidad de dígitos adicionales para garantizar un redondeo correcto; sin embargo, para la suma o resta binaria utilizando técnicas de implementación cuidadosas, solo un bit de protección , un bit de redondeo y un bit adhesivo adicional deben llevarse más allá de la precisión de los operandos. [22] [33] : 218–220


Otro problema de pérdida de significancia ocurre cuando se restan aproximaciones a dos números casi iguales. En el siguiente ejemplo e  = 5; s  = 1,234571 ye  = 5; s  = 1.234567 son aproximaciones a los racionales 123457.1467 y 123456.659.

 e = 5; s = 1,234571- e = 5; s = 1,234567---------------- e = 5; s = 0,000004 e = −1; s = 4,000000 (después de redondeo y normalización)

La diferencia de punto flotante se calcula exactamente porque los números son cercanos; el lema de Sterbenz lo garantiza, incluso en caso de subdesbordamiento cuando se admite el subdesbordamiento gradual . A pesar de esto, la diferencia de los números originales es e  = −1; s  = 4.877000, que difiere más del 20% de la diferencia e  = −1; s  = 4,000000 de las aproximaciones. En casos extremos, se pueden perder todos los dígitos de precisión significativos. [22] [34] Esta cancelación ilustra el peligro de asumir que todos los dígitos de un resultado calculado son significativos. Lidiar con las consecuencias de estos errores es un tema enanálisis numérico ; consulte también Problemas de precisión .

Multiplicación y división [ editar ]

Para multiplicar, los significados se multiplican mientras se suman los exponentes, y el resultado se redondea y normaliza.

 e = 3; s = 4.734612× e = 5; s = 5,417242----------------------- e = 8; s = 25.648538980104 (producto verdadero) e = 8; s = 25,64854 (después del redondeo) e = 9; s = 2.564854 (después de la normalización)

De manera similar, la división se logra restando el exponente del divisor del exponente del dividendo y dividiendo el significado del dividendo por el significado del divisor.

No hay problemas de cancelación o absorción con la multiplicación o la división, aunque se pueden acumular pequeños errores a medida que las operaciones se realizan en sucesión. [22] En la práctica, la forma en que se llevan a cabo estas operaciones en lógica digital puede ser bastante compleja (consulte el algoritmo de multiplicación y el algoritmo de división de Booth ). [nb 9] Para obtener un método rápido y sencillo, consulte el método Horner .

Tratar casos excepcionales [ editar ]

El cálculo de punto flotante en una computadora puede presentar tres tipos de problemas:

  • Una operación puede ser matemáticamente indefinida, como ∞ / ∞, o una división por cero .
  • Una operación puede ser legal en principio, pero no es compatible con el formato específico, por ejemplo, calcular la raíz cuadrada de -1 o el seno inverso de 2 (ambos resultan en números complejos ).
  • Una operación puede ser legal en principio, pero el resultado puede ser imposible de representar en el formato especificado, porque el exponente es demasiado grande o demasiado pequeño para codificarlo en el campo de exponente. Tal evento se llama desbordamiento (exponente demasiado grande), subdesbordamiento (exponente demasiado pequeño) o desnormalización (pérdida de precisión).

Antes del estándar IEEE, tales condiciones generalmente provocaban la terminación del programa o desencadenaban algún tipo de trampa que el programador podría atrapar. Cómo funcionaba esto dependía del sistema, lo que significa que los programas de punto flotante no eran portátiles . (El término "excepción" como se usa en IEEE 754 es un término general que significa una condición excepcional, que no es necesariamente un error, y es un uso diferente al que se define típicamente en lenguajes de programación como C ++ o Java, en el cual un " excepción "es un flujo de control alternativo, más cercano a lo que se denomina una" trampa "en la terminología IEEE 754).

Aquí, se discute el método predeterminado requerido para manejar excepciones de acuerdo con IEEE 754 (no se discuten la captura opcional IEEE 754 y otros modos de "manejo alternativo de excepciones"). Se requiere (por defecto) que las excepciones aritméticas se registren en bits de indicador de estado "fijos". Que sean "pegajosos" significa que no se restablecen en la siguiente operación (aritmética), sino que permanecen configurados hasta que se restablezcan explícitamente. El uso de banderas "pegajosas" permite retrasar la prueba de condiciones excepcionales hasta después de una expresión o subrutina de punto flotante completo: sin ellos, las condiciones excepcionales que no podrían ignorarse de otro modo requerirían pruebas explícitas inmediatamente después de cada operación de punto flotante. Por defecto, una operación siempre devuelve un resultado de acuerdo con la especificación sin interrumpir el cálculo. Por ejemplo, 1/0 devuelve + ∞, mientras que también establece el bit de marca de división por cero (este valor predeterminado de ∞ está diseñado para devolver un resultado finito cuando se usa en operaciones posteriores y, por lo tanto, se ignora con seguridad).

Sin embargo, el estándar IEEE 754 original no recomendaba operaciones para manejar tales conjuntos de bits de indicadores de excepción aritmética. Entonces, si bien estos se implementaron en hardware, inicialmente las implementaciones del lenguaje de programación generalmente no proporcionaban un medio para acceder a ellos (aparte del ensamblador). Con el tiempo, algunos estándares de lenguajes de programación (por ejemplo, C99 / C11 y Fortran) se han actualizado para especificar métodos para acceder y cambiar los bits del indicador de estado. La versión 2008 del estándar IEEE 754 ahora especifica algunas operaciones para acceder y manejar los bits del indicador aritmético. El modelo de programación se basa en un solo hilo de ejecución y el uso de ellos por varios hilos debe manejarse por un medio fuera del estándar (por ejemplo, C11 especifica que las banderas tienenalmacenamiento local de subprocesos ).

IEEE 754 especifica cinco excepciones aritméticas que deben registrarse en los indicadores de estado ("bits adhesivos"):

  • inexacto , se establece si el valor redondeado (y devuelto) es diferente del resultado matemáticamente exacto de la operación.
  • subdesbordamiento , se establece si el valor redondeado es pequeño (como se especifica en IEEE 754) e inexacto (o tal vez limitado a si tiene pérdida de desnormalización, según la versión de 1984 de IEEE 754), devolviendo un valor subnormal que incluye los ceros.
  • desbordamiento , se establece si el valor absoluto del valor redondeado es demasiado grande para ser representado. Se devuelve un valor finito infinito o máximo, según el redondeo que se utilice.
  • dividir por cero , establecer si el resultado es infinito dados los operandos finitos, devolviendo un infinito, ya sea + ∞ o −∞.
  • no válido , se establece si no se puede devolver un resultado de valor real, por ejemplo, sqrt (−1) o 0/0, devolviendo un NaN silencioso.
Fig.1: resistencias en paralelo, con resistencia total

El valor de retorno predeterminado para cada una de las excepciones está diseñado para dar el resultado correcto en la mayoría de los casos, de modo que las excepciones se pueden ignorar en la mayoría de los códigos. inexacto devuelve un resultado correctamente redondeado y el subdesbordamiento devuelve un valor pequeño desnormalizado, por lo que casi siempre se puede ignorar. [35] dividir por cero devuelve infinito exactamente, que normalmente dividirá un número finito y, por lo tanto, dará cero, o de lo contrario, dará una excepción no válida posteriormente, y por lo tanto también se puede ignorar. Por ejemplo, la resistencia efectiva de n resistencias en paralelo (ver figura 1) viene dada por . Si se produce un cortocircuito con el valor 0,devolverá + infinito, lo que dará un final de 0, como se esperaba [36] (ver el ejemplo de fracción continua de la justificación del diseño IEEE 754 para ver otro ejemplo).

Las excepciones de desbordamiento y no válidas generalmente no se pueden ignorar, pero no necesariamente representan errores: por ejemplo, una rutina de búsqueda de raíz , como parte de su operación normal, puede evaluar una función pasada en valores fuera de su dominio, devolviendo NaN y un indicador de excepción no válido que se ignorará hasta encontrar un punto de inicio útil. [35]

Problemas de precisión [ editar ]

El hecho de que los números de punto flotante no puedan representar con precisión todos los números reales, y que las operaciones de punto flotante no puedan representar con precisión operaciones aritméticas verdaderas, conduce a muchas situaciones sorprendentes. Esto está relacionado con la precisión finita con la que las computadoras generalmente representan números.

Por ejemplo, la no representabilidad de 0.1 y 0.01 (en binario) significa que el resultado de intentar cuadrar 0.1 no es 0.01 ni el número representable más cercano a él. En la representación de 24 bits (precisión simple), 0,1 (decimal) se proporcionó previamente como e  = −4; s  = 110011001100110011001101, que es

0.100000001490116119384765625 exactamente.

Al elevar este número al cuadrado se obtiene

0.010000000298023226097399174250313080847263336181640625 exactamente.

Cuadrarlo con hardware de punto flotante de precisión simple (con redondeo) da

0.010000000707805156707763671875 exactamente.

Pero el número representable más cercano a 0.01 es

0.009999999776482582092285156250 exactamente.

Además, la no representabilidad de π (y π / 2) significa que un intento de cálculo de tan (π / 2) no producirá un resultado de infinito, ni siquiera se desbordará en los formatos habituales de punto flotante (asumiendo una precisión implementación de bronceado). Simplemente no es posible que el hardware de punto flotante estándar intente calcular tan (π / 2), porque π / 2 no se puede representar exactamente. Este cálculo en C:

/ * Dígitos suficientes para asegurarnos de obtener la aproximación correcta. * / doble  pi  =  3,1415926535897932384626433832795 ; doble  z  =  tan ( pi / 2.0 );

dará un resultado de 16331239353195370.0. En precisión simple (usando la función tanf), el resultado será −22877332.0.

De la misma manera, un intento de cálculo de sin (π) no arrojará cero. El resultado será (aproximadamente) 0,1225 × 10 - 15 en precisión doble, o −0,8742 × 10 - 7 en precisión simple. [nb 10]

Si bien la suma y la multiplicación de punto flotante son conmutativas ( a + b = b + a y a × b = b × a ), no son necesariamente asociativas . Es decir, ( a + b ) + c no es necesariamente igual a a + ( b + c ). Usando aritmética decimal significativa de 7 dígitos:

 a = 1234,567, b = 45,67834, c = 0,0004
 (a + b) + c: 1234.567 (a) + 45.67834 (b) ____________ 1280.24534 se redondea a 1280.245
 1280.245 (a + b) + 0,0004 (c) ____________ 1280.2454 se redondea a 1280.245 ← (a + b) + c
 a + (b + c): 45.67834 (b) + 0,0004 (c) ____________ 45.67874
 1234.567 (a) + 45.67874 (b + c) ____________ 1280.24574 se redondea a 1280.246 ← a + (b + c)

Tampoco son necesariamente distributivos . Es decir, ( a + b ) × c puede no ser lo mismo que a × c + b × c :

 1234.567 × 3.333333 = 4115.223 1.234567 × 3.333333 = 4.115223 4115.223 + 4.115223 = 4119.338 pero 1234.567 + 1.234567 = 1235.802 1235.802 × 3.333333 = 4119.340

Además de la pérdida de significancia, la incapacidad para representar números como π y 0.1 exactamente, y otras ligeras inexactitudes, pueden ocurrir los siguientes fenómenos:

  • Cancelación : la resta de operandos casi iguales puede causar una pérdida extrema de precisión. [37] [34] Cuando restamos dos números casi iguales, establecemos los dígitos más significativos en cero, dejándonos solo con los dígitos insignificantes y más erróneos. [4] : 124 Por ejemplo, al determinar una derivada de una función se utiliza la siguiente fórmula:
Intuitivamente, uno querría una h muy cercana a cero, sin embargo, cuando se usan operaciones de punto flotante, el número más pequeño no dará la mejor aproximación de una derivada. A medida que h se hace más pequeña, la diferencia entre f (a + h) yf (a) se hace más pequeña, anulando los dígitos más significativos y menos erróneos y haciendo que los dígitos más erróneos sean más importantes. Como resultado, el menor número posible de h dará una aproximación más errónea de una derivada que un número algo mayor. Este es quizás el problema de precisión más común y grave.
  • Las conversiones a números enteros no son intuitivas: convertir (63.0 / 9.0) a números enteros produce 7, pero convertir (0.63 / 0.09) puede producir 6. Esto se debe a que las conversiones generalmente se truncan en lugar de redondear. Las funciones de suelo y techo pueden producir respuestas que se desvían en uno del valor esperado intuitivamente.
  • Rango de exponente limitado: los resultados pueden desbordarse produciendo infinito, o subdesbordarse produciendo un número subnormal o cero. En estos casos se perderá precisión.
  • Probar la división segura es problemático: verificar que el divisor no sea cero no garantiza que una división no se desborde.
  • Probar la igualdad es problemático. Dos secuencias computacionales que son matemáticamente iguales pueden producir diferentes valores de coma flotante. [38]

Incidentes [ editar ]

  • El 25 de febrero de 1991, una pérdida de importancia en una batería de misiles Patriot MIM-104 le impidió interceptar un misil Scud entrante en Dhahran , Arabia Saudita , lo que contribuyó a la muerte de 28 soldados del 14 ° Destacamento de Intendencia del Ejército de los EE. UU . [39]

Precisión de la máquina y análisis de errores hacia atrás [ editar ]

La precisión de la máquina es una cantidad que caracteriza la precisión de un sistema de punto flotante y se utiliza en el análisis de errores hacia atrás de los algoritmos de punto flotante. También se conoce como redondeo de unidades o épsilon de máquina . Usualmente denotado como Ε mach , su valor depende del redondeo particular que se utilice.

Con redondeo a cero,

mientras que redondeando al más cercano,

Esto es importante ya que limita el error relativo al representar cualquier número real x distinto de cero dentro del rango normalizado de un sistema de punto flotante:

El análisis de errores hacia atrás, cuya teoría fue desarrollada y popularizada por James H. Wilkinson , se puede utilizar para establecer que un algoritmo que implementa una función numérica es numéricamente estable. [40] El enfoque básico es mostrar que aunque el resultado calculado, debido a errores de redondeo, no será exactamente correcto, es la solución exacta a un problema cercano con datos de entrada ligeramente perturbados. Si la perturbación requerida es pequeña, del orden de la incertidumbre en los datos de entrada, entonces los resultados son en cierto sentido tan precisos como los datos "merecen". El algoritmo se define entonces como estable hacia atrás . La estabilidad es una medida de la sensibilidad a los errores de redondeo de un procedimiento numérico dado; por el contrario, el número de condiciónde una función para un problema dado indica la sensibilidad inherente de la función a pequeñas perturbaciones en su entrada y es independiente de la implementación utilizada para resolver el problema. [41]

Como ejemplo trivial, considere una expresión simple que da el producto interno de los vectores (longitud dos) y , luego

y entonces

dónde

dónde

por definición, que es la suma de dos datos de entrada ligeramente perturbados (del orden de Ε mach ), por lo que es estable hacia atrás. Para ejemplos más realistas de álgebra lineal numérica , consulte Higham 2002 [42] y otras referencias a continuación.

Minimizar el efecto de los problemas de precisión [ editar ]

Aunque, como se señaló anteriormente, las operaciones aritméticas individuales de IEEE 754 tienen una precisión garantizada dentro de la mitad de un ULP, las fórmulas más complicadas pueden sufrir errores mayores debido al redondeo. La pérdida de precisión puede ser sustancial si un problema o sus datos están mal acondicionados , lo que significa que el resultado correcto es hipersensible a pequeñas perturbaciones en sus datos. Sin embargo, incluso las funciones que están bien acondicionadas pueden sufrir una gran pérdida de precisión si un algoritmo es numéricamente inestablepara eso se utilizan datos: las formulaciones aparentemente equivalentes de expresiones en un lenguaje de programación pueden diferir notablemente en su estabilidad numérica. Un enfoque para eliminar el riesgo de tal pérdida de precisión es el diseño y análisis de algoritmos numéricamente estables, que es un objetivo de la rama de las matemáticas conocida como análisis numérico . Otro enfoque que puede proteger contra el riesgo de inestabilidades numéricas es el cálculo de valores intermedios (cero) en un algoritmo con una precisión mayor que la que requiere el resultado final, [43] que puede eliminar o reducir en órdenes de magnitud, [44] tal riesgo: IEEE 754 precisión cuádruple y precisión extendidaestán diseñados para este propósito cuando se calcula con doble precisión. [45] [nb 11]

Por ejemplo, el siguiente algoritmo es una implementación directa para calcular la función A (x) = (x − 1) / (exp (x − 1) - 1) que está bien condicionada a 1.0, [nb 12] sin embargo puede demostrar ser numéricamente inestable y perder hasta la mitad de los dígitos significativos que lleva la aritmética cuando se calcula cerca de 1.0. [23]

doble  A ( doble  X ){ doble  Y ,  Z ;  // [1] Y  =  X  -  1,0 ; Z  =  exp ( Y ); si  ( Z  ! =  1.0 )  Z  =  Y / ( Z  -  1.0 );  // [2] volver ( Z );}

Sin embargo, si todos los cálculos intermedios se realizan con precisión extendida (por ejemplo, estableciendo la línea [1] en C99 doble largo), entonces se puede mantener la precisión total en el resultado doble final. [nb 13] Alternativamente, un análisis numérico del algoritmo revela que si se realiza el siguiente cambio no obvio en la línea [2]:

 si  ( Z  ! =  1.0 )  Z  =  log ( Z ) / ( Z  -  1.0 );

entonces el algoritmo se vuelve estable numéricamente y puede calcular con precisión doble completa.

Para mantener las propiedades de estos programas numéricamente estables cuidadosamente construidos, se requiere un manejo cuidadoso por parte del compilador . Ciertas "optimizaciones" que pueden realizar los compiladores (por ejemplo, reordenar operaciones) pueden ir en contra de los objetivos del software con buen comportamiento. Existe cierta controversia acerca de las fallas de los compiladores y los diseños de lenguaje en esta área: C99 es un ejemplo de un lenguaje donde tales optimizaciones se especifican cuidadosamente para mantener la precisión numérica. Consulte las referencias externas al final de este artículo.

Un tratamiento detallado de las técnicas para escribir software de punto flotante de alta calidad está más allá del alcance de este artículo, y se remite al lector, [42] [46] y las otras referencias al final de este artículo. Kahan sugiere varias reglas empíricas que pueden disminuir sustancialmente en órdenes de magnitud [46] el riesgo de anomalías numéricas, además de, o en lugar de, un análisis numérico más cuidadoso. Estos incluyen: como se señaló anteriormente, calcular todas las expresiones y resultados intermedios con la mayor precisión admitida en el hardware (una regla general común es tener el doble de precisión del resultado deseado, es decir, calcular con doble precisión para un resultado final de precisión simple, o en precisión doble extendida o cuádruple para obtener resultados de hasta doble precisión[24] ); y redondear los datos de entrada y los resultados solo a la precisión requerida y respaldada por los datos de entrada (llevar un exceso de precisión en el resultado final más allá de lo requerido y respaldado por los datos de entrada puede ser engañoso, aumenta el costo de almacenamiento y disminuye la velocidad, y el exceso de bits puede afectan la convergencia de los procedimientos numéricos: [47] notablemente, la primera forma del ejemplo iterativo dado a continuación converge correctamente cuando se usa esta regla de oro). A continuación se describen brevemente varios problemas y técnicas adicionales.

Como las fracciones decimales a menudo no se pueden representar exactamente en coma flotante binaria, dicha aritmética es mejor cuando simplemente se usa para medir cantidades del mundo real en una amplia gama de escalas (como el período orbital de una luna alrededor de Saturno). o la masa de un protón ), y en el peor de los casos, cuando se espera modelar las interacciones de cantidades expresadas como cadenas decimales que se espera sean exactas. [44] [46] Un ejemplo del último caso son los cálculos financieros. Por esta razón, el software financiero tiende a no utilizar una representación numérica de coma flotante binaria. [48] El tipo de datos "decimal" de los lenguajes de programación C # y Python , y los formatos decimales deEl estándar IEEE 754-2008 está diseñado para evitar los problemas de las representaciones binarias de coma flotante cuando se aplica a valores decimales exactos ingresados ​​por humanos, y hacer que la aritmética siempre se comporte como se espera cuando los números se imprimen en decimal.

Es posible que las expectativas de las matemáticas no se cumplan en el campo de la computación de punto flotante. Por ejemplo, se sabe que , sin embargo, no se puede confiar en estos hechos cuando las cantidades involucradas son el resultado de un cálculo de punto flotante.

El uso de la prueba de igualdad ( if (x==y) ...) requiere cuidado cuando se trata de números de punto flotante. Incluso expresiones simples como 0.6/0.2-3==0will, en la mayoría de las computadoras, no son verdaderas [49] (en IEEE 754, la precisión doble, por ejemplo, 0.6/0.2-3es aproximadamente igual a -4.44089209850063e-16). En consecuencia, estas pruebas a veces se reemplazan con comparaciones "difusas" ( if (abs(x-y) < epsilon) ...donde épsilon es lo suficientemente pequeño y adaptado a la aplicación, como 1.0E-13). La sabiduría de hacer esto varía mucho y puede requerir un análisis numérico para unir épsilon. [42] Los valores derivados de la representación de datos primarios y sus comparaciones deben realizarse con una precisión más amplia y extendida para minimizar el riesgo de tales incoherencias debido a errores de redondeo. [46]A menudo es mejor organizar el código de tal manera que tales pruebas sean innecesarias. Por ejemplo, en geometría computacional , las pruebas exactas de si un punto se encuentra fuera o sobre una línea o plano definido por otros puntos se pueden realizar utilizando precisión adaptativa o métodos aritméticos exactos. [50]

Los pequeños errores en la aritmética de punto flotante pueden crecer cuando los algoritmos matemáticos realizan operaciones una enorme cantidad de veces. Algunos ejemplos son la inversión de matrices , el cálculo de vectores propios y la resolución de ecuaciones diferenciales. Estos algoritmos deben diseñarse con mucho cuidado, utilizando enfoques numéricos como el refinamiento iterativo , para que funcionen bien. [51]

La suma de un vector de valores de punto flotante es un algoritmo básico en la computación científica , por lo que es esencial saber cuándo puede ocurrir una pérdida de importancia. Por ejemplo, si se agrega una gran cantidad de números, los sumandos individuales son muy pequeños en comparación con la suma. Esto puede provocar una pérdida de importancia. Una adición típica sería algo así como

3253.671+ 3.141276-----------3256.812

Los 3 dígitos inferiores de los sumandos se pierden efectivamente. Suponga, por ejemplo, que uno necesita sumar muchos números, todos aproximadamente iguales a 3. Después de que se hayan agregado 1000 de ellos, la suma acumulada es aproximadamente 3000; los dígitos perdidos no se recuperan. El algoritmo de suma de Kahan se puede utilizar para reducir los errores. [42]

El error de redondeo puede afectar la convergencia y precisión de los procedimientos numéricos iterativos. Como ejemplo, Arquímedes se aproximó a π calculando los perímetros de los polígonos que inscriben y circunscriben un círculo, comenzando con hexágonos y doblando sucesivamente el número de lados. Como se señaló anteriormente, los cálculos se pueden reorganizar de una manera matemáticamente equivalente pero menos propensa a errores ( análisis numérico ). Dos formas de la fórmula de recurrencia para el polígono circunscrito son [ cita requerida ] :

  • Primera forma:
  • segunda forma:
, convergiendo como

Aquí hay un cálculo usando aritmética IEEE "doble" (un significado con 53 bits de precisión):

i 6 × 2 i × t i , primera forma 6 × 2 i × t i , segunda forma-------------------------------------------------- ------- 0 3 .4641016151377543863 3 .4641016151377543863 1 3 .2153903091734710173 3 .2153903091734723496 2 3,1 596599420974940120 3,1 596599420975006733 3 3,14 60862151314012979 3,14 60862151314352708 4 3,14 27145996453136334 3,14 27145996453689225 5 3.141 8730499801259536 3.141 8730499798241950 6 3.141 6627470548084133 3.141 6627470568494473 7 3.141 6101765997805905 3.141 6101766046906629 8 3.14159 70343230776862 3.14159 70343215275928 9 3.14159 37488171150615 3.14159 3748771353666810 3.141592 9278733740748 3.141592 927385097988511 3.141592 7256228504127 3.141592 722038614837712 3.1415926 717412858693 3.1415926 70701999212513 3.1415926 189011456060 3.14159265 7867845472814 3.1415926 717412858693 3.14159265 4659307370915 3.14159 19358822321783 3.141592653 857173011916 3.1415926 717412858693 3.141592653 656639422217 3,1415 810075796233302 3,141592653 606506191318 3.1415926 717412858693 3.1415926535 93972883619 3.141 4061547378810956 3.1415926535 90839390120 3,14 05434924008406305 3,1415926535 90056016821 3,14 00068646912273617 3,141592653589 860839622 3,1 349453756585929919 3,141592653589 812211823 3,14 00068646912273617 3,14159265358979 9555224 3 .2245152435345525443 3.14159265358979 6890725 3.14159265358979 6224626 3.14159265358979 6224627 3.14159265358979 6224628 3.14159265358979 62246 El valor real es 3,14159265358979323846264338327 ...

Si bien las dos formas de la fórmula de recurrencia son claramente matemáticamente equivalentes, [nb 14] la primera resta 1 de un número extremadamente cercano a 1, lo que lleva a una pérdida cada vez más problemática de dígitos significativos . A medida que la recurrencia se aplica repetidamente, la precisión mejora al principio, pero luego se deteriora. Nunca supera los 8 dígitos, aunque la aritmética de 53 bits debería tener una precisión de 16 dígitos. Cuando se utiliza la segunda forma de recurrencia, el valor converge a 15 dígitos de precisión.

Ver también [ editar ]

  • C99 para ver ejemplos de código que demuestran el acceso y el uso de las funciones de IEEE 754.
  • Número computable
  • Coprocesador
  • Coma flotante decimal
  • Precisión doble
  • Matemáticas experimentales: utiliza cálculos de punto flotante de alta precisión.
  • Aritmética de punto fijo
  • Mitigación de errores de punto flotante
  • FLOPS
  • Tablas precisas de Gal
  • Biblioteca GNU de precisión múltiple
  • Media precisión
  • IEEE 754 - Estándar para aritmética binaria de coma flotante
  • Arquitectura de punto flotante de IBM
  • Algoritmo de suma de Kahan
  • Formato binario de Microsoft (MBF)
  • Minifloat
  • Q (formato numérico) para una resolución constante
  • Precisión cuádruple
  • Dígitos significantes
  • Precisión simple
  • 0.999 ... - cada decimal de terminación distinto de cero tiene dos representaciones iguales

Notas [ editar ]

  1. ^ La mantisa de un número de coma flotante también se llama mantisa por algunos autores-que no debe confundirse con la mantisa de un logaritmo . Algo vagos, algunos también utilizan términos como coeficiente o argumento . El uso del término fracción por algunos autores también es potencialmente engañoso. El término característica (como lo usan los CDC ) es ambiguo, ya que históricamente también se usó para especificar alguna forma de exponente de números de punto flotante.
  2. ^ El exponente de un número de coma flotante a veces también se denomina escala . El término característica (para exponente sesgado , sesgo de exponente o representación n en exceso ) es ambiguo, ya que históricamente también se usó para especificar el significado de los números de punto flotante.
  3. ^ La aritmética de punto flotante hexadecimal (base 16) se utiliza en IBM System 360 (1964) y 370 (1970), así como en varias máquinas IBM más nuevas, en las computadoras Manchester MU5 (1972) y HEP (1982). También se utiliza en Illinois ILLIAC III (1966), Data General Eclipse S / 200 (ca. 1974), Gould Powernode 9080 (1980), Interdata 8/32 (1970), SEL Systems 85 y 86 , así como en el SDS Sigma 5 (1967), 7 (1966) y Xerox Sigma 9 (1970).
  4. ^ La aritmética de punto flotante octal (base-8) se utiliza en las computadoras Ferranti Atlas (1962), Burroughs B5500 (1964), Burroughs B5700 (1971), Burroughs B6700 (1971) y Burroughs B7700 (1972).
  5. ^ La aritmética de punto flotante cuaternario (base 4) se utiliza en lacomputadora ILLIAC II (1962) de Illinois . También se utiliza en los sistemas de levantamiento de sitios de alta resolución del Digital Field System DFS IV y V.
  6. ^ La aritmética de punto flotante base-256 se utiliza en lacomputadora Rice Institute R1 (desde 1958).
  7. ^ La aritmética de punto flotante Base-65536 se utiliza en lacomputadora MANIAC II (1956).
  8. ^ El hardware de la computadora no calcula necesariamente el valor exacto; simplemente tiene que producir el resultado redondeado equivalente como si hubiera calculado el resultado infinitamente preciso.
  9. ^ La enorme complejidad de los algoritmos de división modernoscondujo una vez a un famoso error. Una primera versión delchip Intel Pentium se envió con una instrucción de división que, en raras ocasiones, dio resultados ligeramente incorrectos. Se enviaron muchas computadoras antes de que se descubriera el error. Hasta que se reemplazaron las computadoras defectuosas, se desarrollaron versiones parcheadas de compiladores que podrían evitar los casos fallidos. Consulte el error Pentium FDIV .
  10. ^ Pero un intento de cálculo de cos (π) produce −1 exactamente. Dado que la derivada es casi cero cerca de π, el efecto de la inexactitud en el argumento es mucho menor que el espaciado de los números de punto flotante alrededor de -1, y el resultado redondeado es exacto.
  11. William Kahan señala: "Excepto en situaciones extremadamente poco comunes, la aritmética extra-precisa generalmente atenúa los riesgos debido al redondeo a un costo mucho menor que el precio de un analista de errores competente".
  12. ^ La expansión de Taylor de esta función demuestra que está bien condicionada cerca de 1: A (x) = 1 - (x − 1) / 2 + (x − 1) ^ 2/12 - (x − 1) ^ 4 / 720 + (x − 1) ^ 6/30240 - (x − 1) ^ 8/1209600 + ... para | x − 1 | <π.
  13. ^ Si el doble largo es la precisión cuádruple IEEE, se retiene la precisión doble completa; si el doble largo es la precisión IEEE doble extendida , se retiene la precisión adicional, pero no completa.
  14. ^ La equivalencia de las dos formas se puede verificar algebraicamente observando que el denominador de la fracción en la segunda forma es el conjugado del numerador de la primera. Al multiplicar la parte superior e inferior de la primera expresión por este conjugado, se obtiene la segunda expresión.

Referencias [ editar ]

  1. ^ W. Smith, Steven (1997). "Capítulo 28, Punto fijo versus flotante" . La guía del científico e ingeniero para el procesamiento de señales digitales . Publicación técnica de California. pag. 514. ISBN 978-0-9660176-3-2. Consultado el 31 de diciembre de 2012 .
  2. ↑ a b Zehendner, Eberhard (verano de 2008). "Rechnerarithmetik: Fest- und Gleitkommasysteme" (PDF) (Guión de la conferencia) (en alemán). Friedrich-Schiller-Universität Jena . pag. 2. Archivado (PDF) desde el original el 7 de agosto de 2018 . Consultado el 7 de agosto de 2018 . [1] (NB. Esta referencia da incorrectamente la base de coma flotante del MANIAC II como 256, mientras que en realidad es 65536).
  3. ↑ a b c d Beebe, Nelson HF (22 de agosto de 2017). "Capítulo H. Arquitecturas históricas de punto flotante". El manual de computación de funciones matemáticas - Programación usando la biblioteca de software portátil MathCW (1 ed.). Salt Lake City, UT, Estados Unidos: Springer International Publishing AG . pag. 948. doi : 10.1007 / 978-3-319-64110-2 . ISBN 978-3-319-64109-6. LCCN  2017947446 . S2CID  30244721 .
  4. ↑ a b c d e Muller, Jean-Michel; Brisebarre, Nicolás; de Dinechin, Florent; Jeannerod, Claude-Pierre; Lefèvre, Vincent; Melquiond, Guillaume; Revol, Nathalie; Stehlé, Damien; Torres, Serge (2010). Manual de aritmética de coma flotante (1 ed.). Birkhäuser . doi : 10.1007 / 978-0-8176-4705-6 . ISBN 978-0-8176-4704-9. LCCN  2009939668 .
  5. Savard, John JG (2018) [2007], "The Decimal Floating-Point Standard" , quadibloc , archivado desde el original el 3 de julio de 2018 , consultado el 16 de julio de 2018.
  6. Parkinson, Roger (7 de diciembre de 2000). "Capítulo 2 - Sistemas digitales de levantamiento de sitios de alta resolución - Capítulo 2.1 - Sistemas digitales de registro de campo" . Encuestas de sitios de alta resolución (1 ed.). Prensa CRC . pag. 24. ISBN 978-0-20318604-6. Consultado el 18 de agosto de 2019 . […] Los sistemas como el [Sistema de campo digital] DFS IV y DFS V eran sistemas de punto flotante cuaternario y utilizaban pasos de ganancia de 12 dB. […] (256 páginas)
  7. Lazarus, Roger B. (30 de enero de 1957) [1 de octubre de 1956]. "MANIAC II" (PDF) . Los Alamos, NM, EE.UU .: Laboratorio Científico de Los Alamos de la Universidad de California. pag. 14. LA-2083. Archivado (PDF) desde el original el 7 de agosto de 2018 . Consultado el 7 de agosto de 2018 . […] La base flotante del Maniac, que es 2 16 = 65,536. […] La gran base del Maniac permite un aumento considerable en la velocidad de la aritmética de coma flotante. Aunque una base tan grande implica la posibilidad de hasta 15 ceros iniciales, el gran tamaño de palabra de 48 bits garantiza un significado adecuado. […]
  8. ^ Randell, Brian (1982). "De motor analítico a computadora digital electrónica: las contribuciones de Ludgate, Torres y Bush". IEEE Annals of the History of Computing . 4 (4): 327–341. doi : 10.1109 / mahc.1982.10042 . S2CID 1737953 . 
  9. ^ Rojas, Raúl (1997). "El legado de Konrad Zuse: la arquitectura de Z1 y Z3" (PDF) . IEEE Annals of the History of Computing . 19 (2): 5–15. doi : 10.1109 / 85.586067 .
  10. Rojas, Raúl (7 de junio de 2014). "El Z1: Arquitectura y algoritmos de la primera computadora de Konrad Zuse". arXiv : 1406.1886 [ cs.AR ].
  11. ↑ a b Kahan, William Morton (15 de julio de 1997). "El efecto nefasto de los lenguajes informáticos y los puntos de referencia sobre las matemáticas aplicadas, la física y la química. Conferencia de John von Neumann" (PDF) . pag. 3.
  12. ^ Randell, Brian , ed. (1982) [1973]. Los orígenes de las computadoras digitales: artículos seleccionados (3 ed.). Berlina; Nueva York: Springer-Verlag . pag. 244. ISBN 978-3-540-11319-5.
  13. ↑ a b Despido, Charles (20 de febrero de 1998). "Una entrevista con el anciano de Floating-Point" .
  14. ^ ISO / IEC 9899: 1999 - Lenguajes de Programación - C . Iso.org. §F.2, nota 307. "Extendido" es el formato de datos de doble extensión de IEC 60559. Extendido se refiere a los formatos IEC 60559 comunes de 80 bits y cuádruples de 128 bits.
  15. ^ Uso de la colección de compiladores GNU, opciones i386 y x86-64 archivadas el 16 de enero de 2015 en Wayback Machine .
  16. ^ "doble largo (específico de GCC) y __float128" . StackOverflow .
  17. ^ "Estándar de llamada de procedimiento para la arquitectura ARM de 64 bits (AArch64)" (PDF) . 2013-05-22 . Consultado el 22 de septiembre de 2019 .
  18. ^ "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 .
  19. Kahan, William Morton (20 de noviembre de 2004). "Sobre el costo de la computación de punto flotante sin aritmética extraprecisa" (PDF) . Consultado el 19 de febrero de 2012 .
  20. ^ "openEXR" . openEXR . Consultado el 25 de abril de 2012 .
  21. ^ "Análisis IEEE-754" .
  22. ↑ a b c d Goldberg, David (marzo de 1991). "Lo que todo informático debe saber sobre la aritmética de punto flotante" (PDF) . Encuestas de computación ACM . 23 (1): 5–48. doi : 10.1145 / 103162.103163 . S2CID 222008826 . Consultado el 20 de enero de 2016 .  ( [2] , [3] , [4] )
  23. ^ a b c Kahan, William Morton ; Darcy, Joseph (2001) [1 de marzo de 1998]. "Cómo el punto flotante de Java perjudica a todos en todas partes" (PDF) . Consultado el 5 de septiembre de 2003 .
  24. ↑ a b Kahan, William Morton (12 de febrero de 1981). "¿Por qué necesitamos un estándar aritmético de punto flotante?" (PDF) . pag. 26.
  25. ↑ a b Kahan, William Morton (11 de junio de 1996). "El efecto nefasto de los puntos de referencia informáticos sobre las matemáticas aplicadas, la física y la química" (PDF) .
  26. ^ Herf, Michael (diciembre de 2001). "trucos radix" . estereopsis: gráficos .
  27. ↑ a b Kharya, Paresh (14 de mayo de 2020). "TensorFloat-32 en la GPU A100 acelera el entrenamiento de IA, HPC hasta 20x" . Consultado el 16 de mayo de 2020 .
  28. Kahan, William Morton (11 de enero de 2006). "¿Cuán inútiles son las evaluaciones inconscientes del redondeo en la computación de punto flotante?" (PDF) .
  29. ^ Loitsch, Florian (2010). "Impresión de números de punto flotante de forma rápida y precisa con números enteros" (PDF) . Actas de la Conferencia 2010 ACM SIGPLAN sobre diseño e implementación de lenguajes de programación - PLDI '10 : 233. doi : 10.1145 / 1806596.1806623 . ISBN  9781450300193. S2CID  910409 .
  30. ^ "Añadido soporte del algoritmo Grisu3 para double.ToString (). Por mazong1123 · Pull Request # 14646 · dotnet / coreclr" . GitHub .
  31. Adams, Ulf (2 de diciembre de 2018). "Ryū: conversión rápida de flotador a cadena" . Avisos ACM SIGPLAN . 53 (4): 270-282. doi : 10.1145 / 3296979.3192369 . S2CID 218472153 . 
  32. ^ "google / doble conversión" . 2020-09-21.
  33. ^ Patterson, David A .; Hennessy, John L. (2014). Organización y diseño de computadoras, la interfaz hardware / software . La serie Morgan Kaufmann en arquitectura y diseño de computadoras (5ª ed.). Waltham, MA: Elsevier. pag. 793. ISBN 9789866052675.
  34. ^ a b Patente estadounidense 3037701A , Huberto M Sierra, "Medios de control aritmético de coma decimal flotante para calculadora", emitida el 5 de junio de 1962 
  35. ↑ a b Kahan, William Morton (1 de octubre de 1997). "Notas de la conferencia sobre el estado del estándar IEEE 754 para aritmética de coma flotante binaria" (PDF) . pag. 9.
  36. ^ "D.3.2.1" . Manuales para desarrolladores de software de arquitecturas Intel 64 e IA-32 . 1 .
  37. ^ Harris, Richard (octubre de 2010). "¡Vas a tener que pensar!" . Sobrecarga (99): 5–10. ISSN 1354-3172 . Consultado el 24 de septiembre de 2011 . Mucho más preocupante es el error de cancelación que puede producir una pérdida catastrófica de precisión.  [5]
  38. ^ Christopher Barker: PEP 485 - Una función para probar la igualdad aproximada
  39. ^ "Defensa de misiles Patriot, problema de software condujo a falla del sistema en Dharhan, Arabia Saudita" . Oficina de Contabilidad del Gobierno de EE . UU . Informe GAO IMTEC 92-26.
  40. Wilkinson, James Hardy (8 de septiembre de 2003). Ralston, Anthony; Reilly, Edwin D .; Hemmendinger, David (eds.). Análisis de errores . Enciclopedia de Ciencias de la Computación . Wiley . págs. 669–674. ISBN 978-0-470-86412-8. Consultado el 14 de mayo de 2013 .
  41. ^ Einarsson, Bo (2005). Precisión y fiabilidad en informática científica . Sociedad de Matemática Industrial y Aplicada (SIAM). págs. 50–. ISBN 978-0-89871-815-7. Consultado el 14 de mayo de 2013 .
  42. ↑ a b c d Higham, Nicholas John (2002). Precisión y estabilidad de algoritmos numéricos (2 ed.). Sociedad de Matemática Industrial y Aplicada (SIAM). págs. 27–28, 110–123, 493. ISBN 978-0-89871-521-7. 0-89871-355-2.
  43. ^ Oliveira, Suely; Stewart, David E. (7 de septiembre de 2006). Redacción de software científico: una guía para el buen estilo . Prensa de la Universidad de Cambridge . págs. 10–. ISBN 978-1-139-45862-7.
  44. ↑ a b Kahan, William Morton (15 de julio de 2005). "Aritmética de punto flotante asediada por" decisiones comerciales " " (PDF) (discurso de apertura). ARITH 17 patrocinado por IEEE , Simposio sobre aritmética informática. págs. 6, 18 . Consultado el 23 de mayo de 2013 . CS1 maint: location (link)(NB. Kahan estima que la incidencia de resultados excesivamente inexactos cerca de singularidades se reduce en un factor de aproximadamente 1/2000 utilizando los 11 bits adicionales de precisión de doble extendido ).
  45. Kahan, William Morton (3 de agosto de 2011). "Remedios desesperadamente necesarios para la falta de depuración de grandes cálculos de punto flotante en ciencia e ingeniería" (PDF) . Conferencia de trabajo IFIP / SIAM / NIST sobre cuantificación de la incertidumbre en la informática científica Boulder CO. P. 33.
  46. ↑ a b c d Kahan, William Morton (27 de agosto de 2000). "Marketing versus Matemáticas" (PDF) . págs. 15, 35, 47.
  47. Kahan, William Morton (4 de junio de 2001). Bindel, David (ed.). "Apuntes de la conferencia de soporte de sistemas para la computación científica" (PDF) .
  48. ^ "Aritmética decimal general" . Speleotrove.com . Consultado el 25 de abril de 2012 .
  49. ^ Christiansen, Tom; Torkington, Nathan; et al. (2006). "perlfaq4 / ¿Por qué int () no funciona?" . perldoc.perl.org . Consultado el 11 de enero de 2011 .
  50. ^ Shewchuk, Jonathan Richard (1997). "Aritmética de punto flotante de precisión adaptativa y predicados geométricos rápidos y robustos, geometría discreta y computacional 18" : 305–363. Cite journal requires |journal= (help)
  51. ^ Kahan, William Morton ; Ivory, Melody Y. (3 de julio de 1997). "Redondeo degrada un voladizo idealizado" (PDF) .

Lectura adicional [ editar ]

  • Wilkinson, James Hardy (1963). Errores de redondeo en procesos algebraicos (1 ed.). Englewood Cliffs, Nueva Jersey, EE. UU .: Prentice-Hall, Inc. ISBN 9780486679990. Señor  0161456 . (NB. Tratados influyentes clásicos sobre aritmética de punto flotante).
  • Wilkinson, James Hardy (1965). El problema de los valores propios algebraicos . Monografías sobre análisis numérico (1 ed.). Prensa de la Universidad de Oxford / Prensa de Clarendon . ISBN 9780198534037. Consultado el 11 de febrero de 2016 .
  • Sterbenz, Pat H. (1 de mayo de 1974). Computación en coma flotante . Serie de Prentice-Hall en computación automática (1 ed.). Englewood Cliffs, Nueva Jersey, EE.UU .: Prentice Hall . ISBN 0-13-322495-3.
  • Golub, Gene F .; van Loan, Charles F. (1986). Cálculos matriciales (3 ed.). Prensa de la Universidad Johns Hopkins . ISBN 978-0-8018-5413-2.
  • Prensa, William Henry ; Teukolsky, Saul A .; Vetterling, William T .; Flannery, Brian P. (2007) [1986]. Recetas numéricas: el arte de la informática científica (3 ed.). Prensa de la Universidad de Cambridge . ISBN 978-0-521-88407-5. (NB. Edición con CD-ROM de código fuente.)
  • Knuth, Donald Ervin (1997). "Sección 4.2: Aritmética de coma flotante". El arte de la programación informática . 2: Algoritmos seminuméricos (3 ed.). Addison-Wesley . págs. 214-264. ISBN 978-0-201-89684-8.
  • Blaauw, Gerrit Anne ; Brooks, Jr., Frederick Phillips (1997). Arquitectura informática: conceptos y evolución (1 ed.). Addison-Wesley . ISBN 0-201-10557-8. (1213 páginas) (NB. Esta es una edición de un solo volumen. Este trabajo también estaba disponible en una versión de dos volúmenes).
  • Savard, John JG (2018) [2005], "Floating-Point Formats" , quadibloc , archivado desde el original el 16 de julio de 2018 , consultado el 16 de julio de 2018
  • Muller, Jean-Michel; Brunie, Nicolas; de Dinechin, Florent; Jeannerod, Claude-Pierre; Joldes, Mioara; Lefèvre, Vincent; Melquiond, Guillaume; Revol, Nathalie; Torres, Serge (2018) [2010]. Manual de aritmética de coma flotante (2 ed.). Birkhäuser . doi : 10.1007 / 978-3-319-76526-6 . ISBN 978-3-319-76525-9. LCCN  2018935254 .

Enlaces externos [ editar ]

  • "Estudio de formatos de coma flotante" . (NB. Esta página ofrece un resumen muy breve de los formatos de punto flotante que se han utilizado a lo largo de los años).
  • Monniaux, David (mayo de 2008). "Las trampas de verificar cálculos de punto flotante" . Association for Computing Machinery (ACM) Transacciones sobre lenguajes y sistemas de programación (TOPLAS). (NB. Un compendio de comportamientos no intuitivos de punto flotante en arquitecturas populares, con implicaciones para la verificación y prueba de programas).
  • OpenCores . (NB. Este sitio web contiene núcleos IP de punto flotante de código abierto para la implementación de operadores de punto flotante en dispositivos FPGA o ASIC. El proyecto double_fpu contiene el código fuente verilog de una unidad de punto flotante de doble precisión. El proyecto fpuvhdl contiene el código fuente vhdl código de una unidad de coma flotante de precisión simple.)
  • Fleegal, Eric (2004). "Optimización de punto flotante de Microsoft Visual C ++" . MSDN .