Articulo de referencia

Yaya

Un ejemplo de NaN que aparece como un error de cálculo para la entrada N/A en un pronóstico meteorológico electrónico. En informática , NaN ( / n æ n / ), que significa Not a Nu...

Un ejemplo de NaN que aparece como un error de cálculo para la entrada N/A en un pronóstico meteorológico electrónico.

En informática , NaN ( / n æ n / ), que significa Not a Number (No es un número ), es un valor particular de un tipo de datos numéricos (a menudo un número de punto flotante ) que no está definido como un número, como el resultado de00{\displaystyle {\frac {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 , el resultado de00{\displaystyle {\frac {0}{0}}}Por lo general, no se define como un número [ a ] y, por lo tanto, puede representarse como 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 se representa como NaN en sistemas informáticos compatibles. Los NaN también pueden usarse para representar valores faltantes en 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 a 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 se suelen tratar como casos especiales en las representaciones de punto flotante de números reales, así como en las operaciones de punto flotante. Una operación no válida tampoco es lo mismo que un desbordamiento aritmético (que devolvería infinito o el mayor número finito en magnitud) o un subdesbordamiento aritmético (que devolvería el menor número normal en magnitud, un número subnormal o cero ).

En los formatos de intercambio binario IEEE 754 , los NaN se codifican con el campo del exponente lleno de unos (como los valores infinitos) y algún número distinto de cero en el campo de la mantisa final (para diferenciarlos de los valores infinitos); esto permite definir múltiples valores NaN distintos, dependiendo de qué bits estén activados en el campo de la mantisa final, pero también del valor del bit de signo inicial (aunque las aplicaciones no están obligadas a proporcionar una semántica distinta para esos distintos valores NaN).

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 (generalmente ignorado 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 " (consulte los detalles en Codificación ). Los bits restantes codifican una carga útil (generalmente ignorada 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 sobre un NaN señalizador ( 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 silenciosa de NaN a través de operaciones aritméticas permite detectar errores al final de una secuencia de operaciones sin necesidad de realizar pruebas exhaustivas durante las etapas intermedias. Por ejemplo, si se comienza con un NaN y se suma 1 cinco veces seguidas, cada suma resulta en un NaN, pero no es necesario comprobar cada cálculo, ya que basta con observar que el resultado final es NaN. Sin embargo, dependiendo del lenguaje y la función, los NaN pueden eliminarse 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 comprobar solo el resultado final ocultaría el hecho de que un cálculo anterior a x 0 resultó en un NaN. En general, entonces, se necesita una prueba posterior para establecer un indicador de inválido para detectar todos los casos en los que se introducen NaN [ 3 ] (véase la definición de la función a continuación para obtener más detalles).

En la sección 6.2 del antiguo estándar IEEE 754-2008 , existen dos funciones anómalas (las funciones ` maxNumand` 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 es NaN, se devuelve el valor del otro operando. La revisión IEEE 754-2019 ha reemplazado estas funciones, ya que no son 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 los 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 que, igual a o mayor que el segundo. Esto da tres relaciones posibles. 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: no ordenada . En particular, dos valores NaN se comparan como no ordenados, no como iguales.

Como se especifica, los predicados asociados con el<{\displaystyle <},{\displaystyle \leq },={\displaystyle =},{\displaystyle \geq },>{\displaystyle >}Los símbolos matemáticos (o notación equivalente en lenguajes de programación) devuelven falso en una relación no ordenada. Por lo tanto, por ejemplo, NO(incógnita<y){\displaystyle (x<y)}no es lógicamente equivalente aincógnitay{\displaystyle x\geq y}en desordenado, es decir cuandoincógnita{\displaystyle x}oy{\displaystyle y}es NaN, el primero devuelve verdadero mientras que el segundo devuelve falso. Sin embargo,{\displaystyle \neq }se define como la negación de={\displaystyle =}, por lo tanto, devuelve verdadero en un caso no ordenado.

A partir de estas reglas, comparandoincógnita{\displaystyle x}consigo mismo,incógnitaincógnita{\displaystyle x\neq x}oincógnita=incógnita{\displaystyle x=x}, se puede utilizar para comprobar siincógnita{\displaystyle x}es NaN o no NaN.

Los predicados de comparación son señalizadores o no señalizadores en operandos NaN silenciosos; las versiones señalizadoras señalan la excepción de operación no válida para dichas comparaciones (es decir, por defecto, esto solo establece el indicador de estado correspondiente además del comportamiento de las versiones no señalizadoras). Los predicados de igualdad y desigualdad no son señalizadores. Los demás predicados de comparación estándar asociados con los símbolos matemáticos anteriores son todos señalizadores si reciben un operando NaN. El estándar también proporciona versiones no señalizadoras de estos otros predicados. El predicado determina si un valor es un NaN y nunca señala una excepción, incluso siisNaN(x{\displaystyle x})incógnita{\displaystyle x}es un NaN de señalización.

El estándar de punto flotante IEEE requiere que NaN{\displaystyle \neq }NaN se mantiene. En contraste, el estándar privado de aritmética positiva de 2022 tiene un concepto similar, NaR (Not a Real), donde NaR={\displaystyle =}NaR se mantiene. [ 7 ]

Operaciones que generan NaN

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

  • La mayoría de las operaciones con al menos un operando NaN.
  • Formas indeterminadas :
    • Las divisiones(±0)/(±0){\displaystyle (\pm 0)/(\pm 0)}y(±)/(±){\displaystyle (\pm \infty )/(\pm \infty )}.
    • Las multiplicaciones(±0)×(±){\displaystyle (\pm 0)\times (\pm \infty )}y(±)×(±0){\displaystyle (\pm \infty )\times (\pm 0)}.
    • Restoincógnitamody{\displaystyle x{\bmod {y}}}cuandoincógnita{\displaystyle x}es un infinito oy{\displaystyle y}es cero.
    • Las adiciones(+)+(){\displaystyle (+\infty )+(-\infty )},()+(+){\displaystyle (-\infty)+(+\infty)}y restas equivalentes(+)(+){\displaystyle (+\infty)-(+\infty)}y()(){\displaystyle (-\infty)-(-\infty)}.
    • La función de raíz enésimaincógnitanorte{\displaystyle {\sqrt[{n}]{x}}}cuandonorte{\displaystyle n}es cero.
    • Funciones trigonométricas en el infinito:pecado(±){\displaystyle \sin(\pm \infty)},porque(±){\displaystyle \cos(\pm \infty)},broncearse(±){\displaystyle \tan(\pm \infty)}.
    • El estándar trata de manera especial la arcotangente de dos argumentos : sus formas indeterminadasatan2(±0,±0){\displaystyle \operatorname {atan2} (\pm 0,\pm 0)}yatan2(±,±){\displaystyle \operatorname {atan2} (\pm \infty ,\pm \infty )}no son NaN sino varios múltiplos deπ/4{\displaystyle \pi /4}.
    • El estándar tiene funciones alternativas para las potencias:
      • La función estándar powy la pownfunción exponencial entera definen00{\displaystyle 0^{0}},1(±){\displaystyle 1^{(\pm \infty )}}, y(±)0{\displaystyle (\pm \infty )^{0}}como1{\displaystyle 1}.
      • La powrfunción define las tres formas indeterminadas como operaciones no válidas y, por lo tanto, devuelve NaN.
  • Operaciones reales con resultados complejos , por ejemplo:
    • La raíz cuadrada de un número negativo.
    • El logaritmo de un número negativo.
    • El seno inverso o el coseno inverso de un número menor que −1 o mayor que 1.
    • La función de raíz enésimaincógnitanorte{\displaystyle {\sqrt[{n}]{x}}}cuandoincógnita{\displaystyle x}es un número negativo ynorte{\displaystyle n}es un número par.
    • Para el funcionamiento de la energíaincógnitay{\displaystyle x^{y}}conincógnita{\displaystyle x}al ser un número negativo, las funciones estándar powy powrse comportan de manera diferente: powrsiempre devuelve NaN en este caso, mientras que powsolo devolverá NaN siy{\displaystyle y}no es un número entero.

Los valores NaN también pueden asignarse explícitamente a las variables, generalmente como representación de valores faltantes. Antes del estándar IEEE, los programadores solían usar 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 ]

No necesariamente se generan NaN 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 causará una trampa. [ 9 ] Si un operando es un NaN silencioso y tampoco hay un operando NaN de señalización, entonces no hay condición de excepción y el resultado es un NaN silencioso. Las asignaciones explícitas no causarán una excepción incluso para NaN de señalización.

Silencio NaN

En general, los NaN silenciosos (qNaN) no generan excepciones adicionales, ya que se propagan a través de la mayoría de las operaciones. Sin embargo, la excepción de operación no válida se activa con 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, al ser consumidos por la mayoría de las operaciones, deberían generar la excepción de operación no válida y luego, si corresponde, ser "silenciados" en un qNaN que puede propagarse. Se introdujeron en IEEE 754. Se han propuesto varias ideas sobre cómo podrían utilizarse:

  • Si se utiliza memoria no inicializada con valores NaN de señalización, se producirá una excepción de operación no válida si los datos se utilizan antes de su inicialización.
  • Utilizar un sNaN como marcador de posición para un objeto más complejo , como por ejemplo:

Cuando se encuentra, un manejador de trampas podría decodificar el sNaN y devolver un índice al resultado calculado. En la práctica, este enfoque presenta muchas complicaciones. El tratamiento del bit de signo de los NaN para algunas operaciones simples (como el valor absoluto ) es diferente al de las operaciones aritméticas. Las trampas no son obligatorias según el estándar.

Operaciones de carga útil

IEEE 754-2019 recomienda que se implementen 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 de IEEE 754-2019, esta recomendación debe interpretarse como "obligatoria para nuevas implementaciones, con reserva de compatibilidad con versiones anteriores". [ 12 ]

Codificación

En los formatos de intercambio IEEE 754 , los NaN se identifican mediante patrones de bits específicos y predefinidos, únicos para los NaN. El bit de signo no importa. Para los formatos binarios, los NaN se representan con el campo del exponente lleno de unos (como los valores infinitos) y algún número distinto de cero en el campo de la mantisa final (para distinguirlos de los valores infinitos). El  estándar original IEEE 754 de 1985 ( IEEE 754-1985 ) solo describía formatos binarios de punto flotante y no especificaba cómo se debía etiquetar el estado de señalización/silencio. En la práctica, el bit más significativo del campo de la mantisa final determinaba si un NaN era de señalización o silencioso. Esto dio lugar a dos implementaciones diferentes, con significados invertidos:

  • La mayoría de los procesadores (incluidos los de la familia x86 de Intel y AMD , la familia Motorola 68000 , la familia AIM PowerPC , la familia ARM , la familia Sun SPARC y, opcionalmente, los nuevos procesadores MIPS ) establecen el bit de señalización/silencio en un valor distinto de cero si el NaN está en silencio y en cero si el NaN está señalizando. Por lo tanto, en estos procesadores, el bit representa un indicador;is_quiet
  • En los valores NaN generados por los procesadores PA-RISC y MIPS antiguos, el bit de señalización/silencio es cero si el NaN es silencioso y distinto de cero si está emitiendo una señal. Por lo tanto, en estos procesadores, el bit representa un is_signalingindicador.

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

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

  • Para los formatos de intercambio binario, el bit más significativo del campo mantisa final se utiliza exclusivamente para distinguir entre NaN silenciosos y de señalización. [ 14 ] (Este requisito se añadió en la revisión de 2019). Además, debe ser un is_quietindicador. [ 15 ] Es decir, este bit es distinto de cero si el NaN es silencioso y cero si el NaN es de señalización.
  • Para los formatos de intercambio decimal, ya sean binarios o codificados en decimal, un NaN se identifica estableciendo los cinco bits superiores del campo de combinación después del bit de signo en unos. El sexto bit del campo es el is_signalingindicador. Es decir, este bit es cero si el NaN no está activo y distinto de cero si está activo. [ 16 ]

Para  cumplir con la norma IEEE 754-2008, el significado del bit de señalización/silencio en los procesadores MIPS recientes ahora se puede configurar mediante el campo NAN2008 del registro FCSR. Esta función es opcional en MIPS Release  3 y obligatoria en Release  5. [ 17 ]

El estado de los bits restantes del campo mantisa final no está definido por el estándar. Estos bits codifican un valor llamado "carga útil" del NaN. Para los formatos binarios, la codificación no está especificada. Para los formatos decimales, se utiliza la codificación habitual de enteros sin signo. Si una operación tiene una única entrada NaN y la propaga a la salida, la carga útil del NaN resultante debe ser la del NaN de entrada (esto no siempre es posible para los formatos binarios cuando el estado de señalización/silencio está codificado por un is_signalingindicador, como se explicó anteriormente). Si hay varias entradas NaN, la carga útil del NaN resultante debe provenir de uno de los NaN de entrada; el estándar no especifica cuál.

NaN canónico

Varios sistemas emplean el concepto de "NaN canónico", donde se elige un valor NaN específico como el único qNaN posible generado por operaciones de punto flotante que no reciben una entrada NaN. Este valor suele ser un NaN silencioso con una carga útil de ceros y un bit de signo definido arbitrariamente.

  • En RISC-V , la mayoría de las operaciones de punto flotante solo generan el NaN canónico, incluso si se proporciona un NaN como operando (la carga útil no se propaga). [ 18 ] [ b ] ARM puede habilitar un modo "NaN predeterminado" para este comportamiento. [ 20 ] WebAssembly tiene el mismo comportamiento, aunque permite dos valores canónicos. [ 21 ]
  • Varios lenguajes no distinguen entre diferentes valores NaN, sin que sus implementaciones requieran forzar un valor NaN específico. El código ECMAScript (JavaScript) trata todos los NaN como si fueran el mismo valor. [ 22 ] Java tiene el mismo tratamiento "en la mayoría de los casos". [ 23 ]

El uso de una cantidad limitada de representaciones NaN permite al sistema utilizar otros posibles valores NaN para fines no aritméticos, siendo el más importante el "NaN-boxing", es decir, el uso de la carga útil para datos arbitrarios. [ 24 ] (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 diferentes opiniones sobre la definición adecuada del resultado de una función numérica que recibe un NaN silencioso como entrada. Una postura sostiene que el NaN debe propagarse a la salida de la función en todos los casos para indicar un error. Otra postura, adoptada generalmente por las normas ISO  C99 e IEEE  754-2008 , establece 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 debe ser el resultado. Por lo tanto, por ejemplo, el valor devuelto por hypot(±∞, qNaN)y hypot(qNaN, ±∞)es+{\displaystyle +\infty }.

El problema es particularmente agudo para la función de exponenciación pow(x, y)=incógnitay{\displaystyle x^{y}}. Las expresiones00{\displaystyle 0^{0}},0{\displaystyle \infty ^{0}}y1{\displaystyle 1^{\infty }}se consideran formas indeterminadas cuando aparecen como límites (al igual que×0{\displaystyle \infty \times 0}), y la cuestión de si cero elevado a la potencia cero debe definirse como 1 ha dividido opiniones.

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 un infinito . De manera similar, producen 1 incluso cuando x es 0 o un infinito. La razón para devolver el valor 1 para las formas indeterminadas era que el valor de las funciones en los puntos singulares se puede tomar como un valor particular si ese valor está en el límite el valor para todo excepto una parte infinitesimalmente pequeña de una bola alrededor del valor límite de los parámetros. La versión 2008 del estándar IEEE 754 dice que y deberían devolver 1 ya que devuelven 1 cualquier otra cosa que se use en lugar de NaN silencioso. Además, ISO C99, y más tarde IEEE 754-2008, optaron por especificar = 1 en lugar de qNaN; La razón de esta elección se da en la justificación de C: [ 25 ] "En general, C99 evita un resultado NaN cuando un valor numérico es útil. ... El resultado es +∞, porque todos los valores de punto flotante positivos grandes son enteros pares."pow(1, y)pow(x, 0)pow(1, qNaN)pow(qNaN, 0)  pow(−1, ±∞)pow(−2, ∞)

Para satisfacer a aquellos que 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 dé una forma indeterminada .pown(x, n)powr(x, y)

Entero NaN

La mayoría de los formatos de 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 exige que se señalice la excepción de operación no válida .

Por ejemplo, en Java , tales operaciones lanzan java.lang.ArithmeticException. [ 26 ]

En C , dan lugar 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 exige el estándar IEEE) y un valor no especificado.

En el lenguaje R , el valor mínimo con signo (es decir 0x80000000, ) de los enteros está reservado para NA(No disponible). Las conversiones de NaN (o doble NA) a enteros producen entonces un entero.NA

El paquete de Perl utiliza "NaN" para el resultado de cadenas que no representan enteros válidos. [ 27 ]Math::BigInt

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

Mostrar

Los distintos sistemas operativos y lenguajes de programación pueden tener diferentes representaciones de cadena para NaN.

nan (C, C++, Python, Zig) NaN (ECMAScript, Rust, C#, Julia, Java). Julia puede mostrar NaN alternativo, dependiendo de la precisión, NaN32 y NaN16; NaN es para el tipo Float64. Yaya% NAN (C, C++, Rust) NaNQ (IBM XL y AIX: Propuesta n2290 para Fortran y C++) NaNS (ídem) qNaN sNaN 1.#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 silencioso/de señalización e información de diagnóstico opcional (a veces llamada carga útil ), estos también se encontrarán ocasionalmente en representaciones de cadena de NaN. Algunos ejemplos son:

  • Para los lenguajes C y C++, el bit de signo siempre se muestra mediante las funciones de la biblioteca estándar (por ejemplo, -nan) cuando está presente. No hay una visualización estándar de la carga útil ni del estado de señalización, pero un valor NaN silencioso de una carga útil específica se puede construir proporcionando la cadena a una función de análisis de números (por ejemplo, ) o proporcionando la cadena de secuencia de caracteres a (o para sNaN), ambas interpretadas de una manera definida por la implementación. nan(char-sequence)strtodnan()nans()
    • GCC y LLVM proporcionan implementaciones integradas de nan()y nans(). Analizan la secuencia de caracteres como un entero para strtoull(o un equivalente de tamaño diferente) con su detección de bases enteras.
    • El analizador de punto flotante de glibc (biblioteca GNU C) utiliza la cadena de secuencia de caracteres de "alguna forma no especificada". [ 28 ] En la práctica, este análisis ha sido equivalente al de GCC/LLVM para hasta 64 bits de carga útil.
    • Newlib no implementa nan()el análisis sintáctico, pero strtod()acepta un formato hexadecimal sin prefijo.
    • musl no implementa ningún análisis de carga útil.

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

Referencias

Notas

  1. 0/0 no está definido como un número tanto en el sistema de números reales como en el sistema de números reales extendidos , mientras que a 1/±0, por ejemplo, se le podría asignar consistentemente un valor de ±∞ en este último sistema, asumiendo un cero con signo .
  2. La norma 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 no generan por sí mismos una carga útil distinta de cero. [ 19 ] Por lo tanto, el comportamiento de RISC-V no es recomendable, pero sí compatible.

Citas

  1. 1 2 Bowman, Kenneth (2006). Introducción a la programación con IDL: lenguaje de datos interactivo . Academic Press. pág . 26. ISBN  978-0-12-088559-6.
  2. Press, William H.; Teukolsky, Saul A.; Vetterling, William T.; Flannery, Brian P. (2007). Numerical Recipes: The Art of Scientific Computing . Cambridge University Press. p. 34. ISBN  978-0-521-88068-8.
  3. William Kahan (1 de octubre de 1997). "Notas de clase sobre el estado de la norma IEEE 754 para aritmética binaria de punto 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) . Recuperado el 6 de mayo de 2019 .
  5. "Actas 754R" . 19 de mayo de 2017. Consultado el 25 de junio de 2017 .
  6. IEEE 754 2019 , §5.11
  7. Estándar para la aritmética positiva (2022)
  8. David Goldberg (1991). "Lo que todo científico informático debería saber sobre la aritmética de punto flotante" .
  9. "Manual del desarrollador de software para 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. "Análisis de antecedentes para 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..." IEEE . 15 de octubre de 2010. Recuperado 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ág. 79. Archivado del original (PDF) el 28 de septiembre de 2017. Consultado el 27 de septiembre de 2017 . 
  18. Embeddev, Cinco. ""F" Extensión estándar 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" . Five EmbedDev .
  19. "Manejo de NaN y el NaN predeterminado (Manual de referencia de la arquitectura ARM, ediciones ARMv7-A y ARMv7-R)" . Documentación – Desarrollador de Arm .
  20. "¿Cuál es la motivación para la canonización de 'NaN'? · Problema n.° 1463 · WebAssembly/design" . GitHub . ver respuesta de Dan Gohman "sunfishcode"
  21. "Especificación del lenguaje ECMAScript® 2026 - 6.1.6.1 El tipo numérico" . tc39.es. En algunas implementaciones, el código externo podría detectar una diferencia entre varios valores NaN, pero dicho comportamiento está definido por la implementación; para el código ECMAScript, todos los valores NaN son indistinguibles entre sí.
  22. "Capítulo 4. Tipos, valores y variables" . docs.oracle.com . En general, la plataforma Java SE trata los valores NaN de un tipo dado como si se fusionaran 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 NaN Boxing". Crafting Interpreters . Genever Benning. ISBN 978-0-9905829-3-9.
  24. "Fundamentos del estándar internacional de lenguajes de programación: C, revisión 5.10" (PDF) . Abril de 2003. pág. 180. 
  25. "ArithmeticException (Java Platform SE 8)" . docs.oracle.com . 
  26. " " . perldoc.perl.org . Consultado el 12 de junio de 2015 .Math::BigInt
  27. "Análisis de números de coma flotante (La biblioteca GNU C)" . sourceware.org . Consultado el 1 de octubre de 2025. Si se proporcionan caracteres... , se utilizan de alguna manera no especificada para seleccionar una representación particular de NaN (puede haber varias).

Estándares

  • IEEE Computer Society (29 de agosto de 2008). Norma IEEE para aritmética de punto flotante . IEEE. págs. 1–70 . doi : 10.1109/IEEESTD.2008.4610935 . ISBN  978-0-7381-5753-5Norma IEEE 754-2008.
  • IEEE Computer Society (22 de julio de 2019). Norma IEEE para aritmética de punto flotante . IEEE. págs. 1–84 . doi : 10.1109/IEEESTD.2019.8766229 . ISBN  978-1-5044-5924-2Norma IEEE 754-2019.
  • No es un número , foldoc.org
  • Norma IEEE 754-2008 para aritmética de punto flotante (se requiere suscripción)
  • Norma IEEE 754-2019 para aritmética de punto flotante (se requiere suscripción)