stringtranslate.com

Yaya

En informática , NaN ( / n æ n / ), que significa No es un número , es un valor particular de un tipo de datos numérico (a menudo un número de punto flotante ) que no está definido como un número, como el resultado de 0/0. . El uso sistemático de NaN fue introducido por el estándar de punto flotante IEEE 754 en 1985, junto con la representación de otras cantidades no finitas como los infinitos .

En matemáticas , 0/0 normalmente no se define como un número [a] y, por lo tanto, se representa mediante NaN en los sistemas informáticos.

La raíz cuadrada de un número negativo no es un número real y, por lo tanto, también está representada por NaN en los sistemas informáticos compatibles. Los NaN también se pueden utilizar para representar valores faltantes en los cálculos. [1] [2]

Se proporcionan dos tipos distintos de NaN, denominados NaN silenciosos y NaN de señalización . Los NaN silenciosos se utilizan para propagar errores resultantes de operaciones o valores no válidos. Los NaN de señalización pueden admitir funciones avanzadas como la combinación de cálculos numéricos y simbólicos u otras extensiones de la aritmética básica de punto flotante.

Punto flotante

En los cálculos de punto flotante, NaN no es lo mismo que infinito , aunque ambos normalmente se manejan como casos especiales en representaciones de punto flotante de números reales, así como en operaciones de punto flotante. Una operación no válida tampoco es lo mismo que un desbordamiento aritmético (que devolvería un infinito o el número finito más grande en magnitud) o un desbordamiento aritmético (que devolvería el número normal más pequeño en magnitud, un número subnormal o cero ).

Los NaN IEEE 754 están codificados con el campo exponente lleno de unos (como valores infinitos) y algún número distinto de cero en el campo significado (para distinguirlos de los valores infinitos); esto permite la definición de múltiples valores NaN distintos, dependiendo de los bits que se establezcan en el campo de significado, pero también del valor del bit de signo inicial (pero no es necesario que las aplicaciones proporcionen una semántica distinta para esos valores NaN distintos).

Por ejemplo, un NaN de precisión simple (32 bits) IEEE 754 se codificaría como

s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx

donde s es el signo (la mayoría de las veces se ignora en las aplicaciones) y la secuencia x representa un número distinto de cero (el valor cero codifica infinitos). En la práctica, el bit más significativo de x se utiliza para determinar el tipo de NaN: "NaN silencioso" o "NaN de señalización" (ver detalles en Codificación). Los bits restantes codifican una carga útil (la mayoría de las veces se ignora en las aplicaciones).

Las operaciones de punto flotante distintas de las comparaciones ordenadas normalmente propagan un NaN silencioso ( qNaN ). La mayoría de las operaciones de punto flotante en un NaN de señalización ( sNaN ) señalan la excepción de operación no válida ; la acción de excepción predeterminada es entonces la misma que para los operandos qNaN y producen un qNaN si producen un resultado de punto flotante.

La propagación de NaN silenciosos a través de operaciones aritméticas permite detectar errores al final de una secuencia de operaciones sin pruebas exhaustivas durante las etapas intermedias. Por ejemplo, si uno comienza con un NaN y suma 1 cinco veces seguidas, cada suma da como resultado un NaN, pero no es necesario verificar cada cálculo porque simplemente se puede notar que el resultado final es NaN. Sin embargo, dependiendo del lenguaje y la función, los NaN se pueden eliminar silenciosamente de una cadena de cálculos donde un cálculo en la cadena daría un resultado constante para todos los demás valores de punto flotante. Por ejemplo, el cálculo x 0 puede producir el resultado 1, incluso cuando x es NaN, por lo que verificar solo el resultado final ocultaría el hecho de que un cálculo antes de x 0 resultó en un NaN. Entonces, en general, se necesita una prueba posterior para detectar un indicador establecido no válido para detectar todos los casos en los que se introducen NaN [3] (consulte la definición de función a continuación para obtener más detalles).

En la sección 6.2 del antiguo estándar IEEE 754-2008 , hay dos funciones anómalas (las funciones maxNumy minNum, que devuelven el máximo y el mínimo, respectivamente, de dos operandos que se espera que sean números) que favorecen los números, si solo uno de los operandos son NaN, entonces se devuelve el valor del otro operando. La revisión IEEE 754-2019 ha sustituido estas funciones por no ser asociativas (cuando aparece un NaN de señalización en un operando). [4] [5]

Comparación con NaN

Las comparaciones están especificadas por el estándar IEEE 754 para tener en cuenta posibles operandos NaN. [6] Al comparar dos números reales, o números reales extendidos (como en los formatos de punto flotante IEEE 754), el primer número puede ser menor, igual o mayor que el segundo número. Esto da tres posibles relaciones. Pero cuando al menos un operando de una comparación es NaN, esta tricotomía no se aplica y se necesita una cuarta relación: desordenada . En particular, dos valores de NaN se comparan como desordenados, no iguales.

Como se especifica, los predicados asociados con los símbolos matemáticos <, ≤, =, ≥, > (o notación equivalente en lenguajes de programación) devuelven falso en una relación desordenada. Entonces, por ejemplo, NOT ( x < y ) no es lógicamente equivalente a xy : en desordenado, es decir, cuando x o y es NaN, el primero devuelve verdadero mientras que el segundo devuelve falso. Sin embargo, ≠ se define como la negación de =, por lo que devuelve verdadero si no está ordenado.

A partir de estas reglas, comparar x consigo mismo, xx o x = x , se puede utilizar para probar si x es NaN o no NaN.

Los predicados de comparación son de señalización o no de señalización en operandos NaN silenciosos; las versiones de señalización señalan la excepción de operación no válida para tales comparaciones (es decir, de forma predeterminada, esto simplemente establece el indicador de estado correspondiente además del comportamiento de las versiones sin señalización). Los predicados de igualdad y desigualdad no son señalizadores. Los otros predicados de comparación estándar asociados con los símbolos matemáticos anteriores señalan si reciben un operando NaN. El estándar también proporciona versiones sin señalización de estos otros predicados. El predicado determina si un valor es un NaN y nunca señala una excepción, incluso si x es un NaN de señalización.isNaN(x)

El estándar de punto flotante IEEE requiere que NaN ≠ NaN se mantenga. Por el contrario, el estándar privado de aritmética positiva de 2022 tiene un concepto similar, NaR (Not a Real), donde NaR = NaR se cumple. [7]

Operaciones que generan NaN

Hay tres tipos de operaciones que pueden devolver NaN: [8]

Los NaN también se pueden asignar explícitamente a variables, generalmente como una representación de valores faltantes. Antes del estándar IEEE, los programadores solían utilizar un valor especial (como −99999999) para representar valores indefinidos o faltantes, pero no había garantía de que se manejaran de manera consistente o correcta. [1]

Los NaN no se generan necesariamente en todos los casos anteriores. Si una operación puede producir una condición de excepción y las trampas no están enmascaradas, entonces la operación provocará una trampa. [9] Si un operando es un NaN silencioso y tampoco hay ningún operando NaN de señalización, entonces no hay ninguna condición de excepción y el resultado es un NaN silencioso. Las asignaciones explícitas no causarán una excepción ni siquiera para la señalización de NaN.

Tranquilo NaN

En general, los NaN silenciosos, o qNaN, no generan ninguna excepción adicional, ya que se propagan a través de la mayoría de las operaciones. Pero la excepción de operación no válida se señala por algunas operaciones que no devuelven un valor de punto flotante, como las conversiones de formato o ciertas operaciones de comparación.

Señalización NaN

Los NaN de señalización, o sNaN, son formas especiales de un NaN que, cuando son consumidos por la mayoría de las operaciones, deben generar la excepción de operación no válida y luego, si corresponde, "silenciarse" en un qNaN que luego puede propagarse. Fueron introducidos en IEEE 754 . Ha habido varias ideas sobre cómo podrían usarse:

Cuando se encuentra, un controlador de trampas podría decodificar el sNaN y devolver un índice al resultado calculado. En la práctica, este enfoque enfrenta muchas complicaciones. El tratamiento del bit de signo de NaN para algunas operaciones simples (como el valor absoluto ) es diferente al de las operaciones aritméticas. La norma no exige trampas. Hay otros enfoques para este tipo de problema que serían más portátiles. [ cita necesaria ]

Operaciones de carga útil

IEEE 754-2019 recomienda implementar las operaciones getPayload , setPayload y setPayloadSignaling , [10] estandarizando el acceso a las cargas útiles para agilizar el uso de las aplicaciones. [11] Según el documento de antecedentes IEEE 754-2019, esta recomendación debe interpretarse como "requerida para nuevas implementaciones, con reservas para la compatibilidad con versiones anteriores". [12]

Codificación

En los formatos de almacenamiento de punto flotante que cumplen con el estándar IEEE 754 , los NaN se identifican mediante patrones de bits específicos y predefinidos exclusivos de los NaN. El bit de signo no importa. Los NaN de formato binario se representan con el campo exponencial lleno de unos (como valores infinitos) y algún número distinto de cero en el campo significativo (para distinguirlos de los valores infinitos). El estándar IEEE 754 original de 1985 ( IEEE 754-1985 ) solo describía formatos binarios de punto flotante y no especificaba cómo se etiquetaría el estado de señalización/silencio. En la práctica, el bit más significativo del campo significativo determina si un NaN está señalizando o en silencio. Como resultado se produjeron dos implementaciones diferentes, con significados invertidos:

Se ha preferido la primera opción, ya que permite a la implementación silenciar un NaN de señalización simplemente estableciendo el bit de señalización/silencio en 1. Lo contrario no es posible con la última opción porque establecer el bit de señalización/silencio en 0 podría producir un infinito. [13]

Las revisiones de 2008 y 2019 del estándar IEEE 754 establecen requisitos y recomendaciones formales para la codificación del estado de señalización/silencio.

Para la conformidad con IEEE 754-2008, el significado del bit de señalización/silencio en los procesadores MIPS recientes ahora se puede configurar a través del campo NAN2008 del registro FCSR. Este soporte es opcional en MIPS Versión 3 y requerido en la Versión 5. [17]

El estado/valor de los bits restantes del campo de significado no están definidos por el estándar. Este valor se denomina "carga útil" del NaN. Si una operación tiene una única entrada NaN y la propaga a la salida, la carga útil de NaN resultante debe ser la de la entrada NaN (esto no siempre es posible para formatos binarios cuando el estado de señalización/silencio está codificado por una is_signalingbandera, como se explicó anteriormente). ). Si hay varias entradas de NaN, la carga útil de NaN resultante debe ser de una de las entradas de NaN; la norma no especifica cuál.

NaN canónico

Varios sistemas tienen el concepto de "NaN canónico", donde se elige un valor de NaN específico como el único qNaN posible generado por operaciones de punto flotante que no tienen una entrada de NaN. Por lo general, el valor se elige para que sea un NaN silencioso con una carga útil todo cero y un bit de signo definido arbitrariamente.

El uso de una cantidad limitada de representaciones de NaN permite que el sistema use otros valores de NaN posibles para fines no aritméticos, siendo el más importante el "NaN-boxing", es decir, usar la carga útil para datos arbitrarios. [23] (Este concepto de "NaN canónico" no es el mismo que el concepto de "codificación canónica" en IEEE 754).

Definición de función

Existen diferencias de opinión sobre la definición adecuada del resultado de una función numérica que recibe un NaN silencioso como entrada. Una opinión es que NaN debería propagarse a la salida de la función en todos los casos para propagar la indicación de un error. Otro punto de vista, y el adoptado por los estándares ISO C99 e IEEE 754-2008 en general, es que si la función tiene múltiples argumentos y la salida está determinada de forma única por todas las entradas que no son NaN (incluido el infinito), entonces ese valor debería sea ​​el resultado. Así, por ejemplo, el valor devuelto por hypot(±∞, qNaN)y hypot(qNaN, ±∞)es +∞.

El problema es particularmente grave para la función de exponenciación = x y . Las expresiones 0 0 , ∞ 0 y 1 se consideran formas indeterminadas cuando aparecen como límites (al igual que ∞ × 0), y la cuestión de si cero elevado a cero debe definirse como 1 ha dividido la opinión.pow(x, y)

Si la salida se considera indefinida cuando un parámetro no está definido, entonces pow(1, qNaN)debería producir un qNaN. Sin embargo, las bibliotecas matemáticas normalmente han devuelto 1 para cualquier número real y , e incluso cuando y es infinito . De manera similar, producen 1 incluso cuando x es 0 o infinito. La razón para devolver el valor 1 para las formas indeterminadas fue que el valor de las funciones en puntos singulares puede tomarse como un valor particular si ese valor está en el límite del valor [ aclaración necesaria ] para todo menos una parte cada vez más pequeña de una bola. alrededor del valor límite de los parámetros. [ cita necesaria ] La versión 2008 del estándar IEEE 754 dice eso y ambos deberían devolver 1 ya que devuelven 1 cualquier otra cosa que se use en lugar de NaN silencioso. Además, ISO C99, y posteriormente IEEE 754-2008, optaron por especificar = 1 en lugar de qNaN; el motivo de esta elección se da en el fundamento de C: [24] "Generalmente, C99 evita un resultado de NaN cuando un valor numérico es útil... El resultado de es +∞, porque todos los valores grandes de punto flotante positivos son pares números enteros."pow(1, y) pow(x, 0)pow(1, qNaN)pow(qNaN, 0)pow(−1, ±∞)pow(−2, ∞)

Para satisfacer a quienes desean una interpretación más estricta de cómo debe actuar la función de potencia, el estándar de 2008 define dos funciones de potencia adicionales: , donde el exponente debe ser un número entero, y , que devuelve un NaN siempre que un parámetro sea un NaN o la exponenciación sería dar una forma indeterminada .pown(x, n)powr(x, y)

Entero NaN

La mayoría de los formatos de números enteros de tamaño fijo no pueden indicar explícitamente datos no válidos. En tal caso, al convertir NaN a un tipo entero, el estándar IEEE 754 requiere que se señale la excepción de operación no válida . Por ejemplo, en Java , dichas operaciones arrojan instancias de java.lang.ArithmeticException. [25] En C , conducen a un comportamiento indefinido , pero si se admite el anexo F, la operación produce una excepción de punto flotante "no válida" (como lo requiere el estándar IEEE) y un valor no especificado.

El paquete de PerlMath::BigInt utiliza "NaN" para el resultado de cadenas que no representan números enteros válidos. [26]

> perl -mMath::BigInt -e "imprimir Math::BigInt->new('foo')" NaN

Mostrar

Diferentes sistemas operativos y lenguajes de programación pueden tener diferentes representaciones de cadenas de NaN.

nan (C, C++, Python)NaN (ECMAScript, Rust, C#, Julia). Julia puede mostrar NaN alternativos, según la precisión, NaN32 y NaN16; NaN es para el tipo Float64.Yaya%NAN (C, C++, óxido)NaNQ (IBM XL y AIX: Fortran, propuesta C++ n2290)NaNS (ídem)qNaNsNaN1.#SNAN (Excel)1.#QNAN (Excel)-1.#IND (Excel)+nan.0 (Esquema)

Dado que, en la práctica, los NaN codificados tienen un signo, un bit de silencio/señalización y una 'información de diagnóstico' opcional (a veces llamada carga útil ), ocasionalmente también se encontrarán en representaciones de cadena de NaN. Algunos ejemplos son:

No todos los idiomas admiten la existencia de múltiples NaN. Por ejemplo, ECMAScript solo usa un valor NaN en todo momento.

Referencias

Notas

  1. ^ 0/0 no está definido como número tanto en el sistema de números reales como en el de números reales extendido , mientras que a 1/±0, por ejemplo, se le podría asignar consistentemente un valor de ±∞ en el último sistema, suponiendo un cero con signo .
  2. ^ IEEE 754-2008 recomienda, pero no exige, la propagación de la carga útil NaN. La mayoría de los procesadores optan por seguir esta recomendación, pero por sí solos no generan una carga útil distinta de cero. [19] Por lo tanto, el comportamiento de RISC-V no es recomendado, pero sí conforme.

Citas

  1. ^ ab Bowman, Kenneth (2006). Introducción a la programación con IDL: lenguaje de datos interactivo . Prensa académica. pag. 26.ISBN _ 978-0-12-088559-6.
  2. ^ Prensa, William H.; Teukolsky, Saúl A.; Vetterling, William T.; Flannery, Brian P. (2007). Recetas numéricas: el arte de la informática científica . Prensa de la Universidad de Cambridge. pag. 34.ISBN _ 978-0-521-88068-8.
  3. ^ William Kahan (1 de octubre de 1997). "Notas de la conferencia sobre el estado del estándar IEEE 754 para aritmética binaria de coma flotante" (PDF) .
  4. ^ David HC Chen (21 de febrero de 2017). "La eliminación/degradación de las operaciones MinNum y MaxNum de IEEE 754™-2018" (PDF) . Consultado el 6 de mayo de 2019 .
  5. ^ "Minutos 754R". 19 de mayo de 2017 . Consultado el 25 de junio de 2017 .
  6. ^ IEEE 754 2019, §5.11
  7. ^ Estándar para aritmética positiva (2022)
  8. ^ David Goldberg (1991). "Lo que todo informático debería saber sobre el punto flotante".
  9. ^ "Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 1: arquitectura básica". Abril de 2008. págs. 118–125, 266–267, 334–335.
  10. ^ IEEE 754 2019, §9.7
  11. ^ "Discusión de antecedentes sobre las nuevas funciones de carga útil".
  12. ^ "Revisión del estándar IEEE para aritmética de punto flotante prevista para 2019" (PDF) .
  13. ^ "Re: Los sNaN (largos) no son lo que podrían ser ..." grouper.ieee.org . 15 de octubre de 2010 . Consultado el 5 de noviembre de 2020 .
  14. ^ IEEE 754 2019, §3.4
  15. ^ IEEE 754 2019, §6.2.1
  16. ^ IEEE 754 2019, §3.5.2
  17. ^ "Arquitectura MIPS® para programadores - Volumen IA: Introducción a la arquitectura MIPS64®" (PDF) . MIPS Technologies, Inc. 20 de noviembre de 2013. p. 79 . Consultado el 27 de septiembre de 2017 .
  18. ^ Embeddev, cinco. "Extensión estándar " F "para punto flotante de precisión simple, versión 2.2 / Manual del conjunto de instrucciones RISC-V, Volumen I: ISA de nivel de usuario RISC-V". Cinco EmbedDev .
  19. ^
    • Niebla, Agner (11 de abril de 2018). "Propagación de la carga útil NaN: problemas sin resolver" (PDF) .
    • Fog Agner (27 de abril de 2020). "Seguimiento de excepciones de punto flotante y propagación NAN" (PDF) .
  20. ^ "Manejo de NaN y NaN predeterminado (Manual de referencia de arquitectura ARM, edición ARMv7-A y ARMv7-R)". Documentación: desarrollador de Arm .
  21. ^ ab "¿Cuál es la motivación para la canonicalización de `NaN`? · Número 1463 · WebAssembly/design". GitHub .– ver respuesta de Dan Gohman "sunfishcode"
  22. ^ "Capítulo 4. Tipos, valores y variables". docs.oracle.com . En su mayor parte, la plataforma Java SE trata los valores NaN de un tipo determinado como si estuvieran colapsados ​​en un único valor canónico y, por lo tanto, esta especificación normalmente se refiere a un NaN arbitrario como si fuera un valor canónico.
  23. ^ Nystrom, Robert (28 de julio de 2021). "§ 30.3 Boxeo NaN". Elaboración de intérpretes. Geneve Benning. ISBN 978-0-9905829-3-9.
  24. ^ "Justificación del estándar internacional: lenguajes de programación: C, revisión 5.10" (PDF) . Abril de 2003. pág. 180.
  25. ^ "ArithmeticException (Plataforma Java SE 8)". docs.oracle.com .
  26. ^ "Matemáticas :: BigInt". perldoc.perl.org . Consultado el 12 de junio de 2015 .
  27. ^ "Análisis de flotantes (la biblioteca GNU C)". www.gnu.org . Consultado el 9 de septiembre de 2021 . Si se proporcionan caracteres... , se utilizan de alguna manera no especificada para seleccionar una representación particular de NaN (puede haber varias).

Estándares

enlaces externos