Yaya

ImprimirCitar

En informática, NaN (), que significa No es un número, es un miembro de un tipo de datos numérico que se puede interpretar como un valor que no está definido o no se puede representar, especialmente en aritmética de punto flotante. El estándar de punto flotante IEEE 754 introdujo el uso sistemático de NaN en 1985, junto con la representación de otras cantidades no finitas, como los infinitos.

En matemáticas, cero dividido por cero no está definido y, por lo tanto, se representa 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 está representada por NaN en los sistemas informáticos compatibles. Los NaN también se pueden usar para representar valores faltantes en los cálculos.

Se proporcionan dos tipos distintos de NaN, denominados NaN silenciosos y NaN de señalización. Los Quiet NaN 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álculo numérico y simbólico u otras extensiones de la aritmética básica de coma flotante.

Coma flotante

En los cálculos de coma flotante, NaN no es lo mismo que infinito, aunque ambos se manejan normalmente como casos especiales en las representaciones de coma flotante de números reales, así como en las operaciones de coma 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 subdesbordamiento 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 se codifican con el campo de exponentes lleno de unos (como valores infinitos) y algún número distinto de cero en el campo de significando (para diferenciarlos de los valores infinitos); esto permite la definición de múltiples valores NaN distintos, dependiendo de qué bits se establezcan en el campo de significado, pero también del valor del bit de signo inicial (pero no se requiere que las aplicaciones proporcionen una semántica distinta para esos valores NaN distintos).

Por ejemplo, un NaN IEEE 754 de precisión simple (32 bits) 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: "quiet NaN" o "señalando NaN" (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 coma flotante distintas de las comparaciones ordenadas normalmente propagan un NaN tranquilo (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 coma 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 hay necesidad de verificar cada cálculo porque uno puede notar que el resultado final es NaN. Sin embargo, según el idioma 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 coma flotante. Por ejemplo, el cálculo x0 puede producir el resultado 1, incluso cuando x es NaN, por lo que verificar solo el resultado final oscurecería el hecho que un cálculo antes del x0 dio como resultado un NaN. En general, entonces, se necesita una prueba posterior para un indicador establecido inválido para detectar todos los casos en los que se introducen NaN (consulte 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, hay dos funciones anómalas (las maxNum y minNum funciones, 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 un 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 una señalización NaN en un operando).

Comparación con NaN

Las comparaciones están especificadas por el estándar IEEE 754 para tener en cuenta posibles operandos NaN. 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 como 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 desorden, es decir, cuando x o y es NaN, el primero devuelve verdadero mientras que el último devuelve falso. Sin embargo, ≠ se define como la negación de =, por lo que devuelve verdadero en desorden.

Comparación entre NaN y cualquier valor de punto flotante x
(incluyendo NaN y ± hígado)
Comparación NN ≥ xNaN ≤ xNaN ■ xNan xNaN = xNaN ل x
Resultado Falso Falso Falso Falso Falso Cierto.

De estas reglas, xx o x = x se puede usar para probar si x es NaN o no NaN.

Los predicados de comparación son de señalización o de no 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 solo 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 de señalización. Los otros predicados de comparación estándar asociados con los símbolos matemáticos anteriores están señalando si reciben un operando NaN. El estándar también proporciona versiones sin señalización de estos otros predicados. El predicado isNaN(x) determina si un valor es un NaN y nunca señala una excepción, incluso si x es un NaN de señalización.

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

Operaciones que generan NaN

Hay tres tipos de operaciones que pueden devolver NaN:

  • La mayoría de operaciones con al menos un NaN operand.
  • Formas indeterminadas:
    • Las divisiones (±0) / (±0) y (± hígado) / (± hígado).
    • Las multiplicaciones (±0) × y (± hígado) × (±0).
    • Restante x% Sí. cuando x es un infinito o Sí. es cero.
    • Las adiciones (+vicios) + (viejo), (Libertad) + (+∞) y sustracciones equivalentes (+∞) - (+∞) y (Libertad);.
    • El estándar tiene funciones alternativas para los poderes:
      • El estándar pow función y el exponente entero pown función definir 00, 1JUEGO, y JUEGO0 como 1.
      • El powr función define las tres formas indeterminadas como operaciones inválidas y así 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 cosina inversa de un número que es inferior a −1 o superior a 1.

Los NaN también se pueden asignar explícitamente a las variables, generalmente como una representación de los valores faltantes. Antes del estándar IEEE, los programadores a menudo usaban 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.

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, la operación generará una trampa en su lugar. Si un operando es un NaN silencioso y tampoco hay un operando NaN de señalización, entonces no hay una condición de excepción y el resultado es un NaN silencioso. Las asignaciones explícitas no causarán una excepción incluso para la señalización de NaN.

NaN tranquila

(feminine)

Los NaN silenciosos, o qNaN, no generan excepciones adicionales, ya que se propagan a través de la mayoría de las operaciones. Las excepciones son cuando el NaN no se puede pasar sin cambios a la salida, como en 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, ser "silenciados" en un qNaN que luego puede propagarse. Se introdujeron en IEEE 754. Ha habido varias ideas sobre cómo podrían usarse:

  • Llenar memoria no inicializada con señalización NaNs produciría la excepción de operación inválida si los datos se utilizan antes de que se inicialice
  • Usando un sNaN como marcador de posición para un objeto más complicado, como:
    • Representación de un número que se ha reducido
    • Una representación de un número que ha desbordado
    • Número en un formato de precisión superior
    • Un número complejo

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 se enfrenta a 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. Las trampas no son requeridas por el estándar. Hay otros enfoques para este tipo de problema que serían más portátiles.

Operaciones de carga útil

IEEE 754-2019 recomienda implementar las operaciones getPayload, setPayload y setPayloadSignaling, estandarizando el acceso a las cargas útiles para agilizar el uso de la aplicación. De acuerdo con el documento de antecedentes IEEE 754-2019, esta recomendación debe interpretarse como "requerida para nuevas implementaciones, con reserva de compatibilidad con versiones anteriores".

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 NaN. El bit de signo no importa. Los NaN de formato binario se representan con el campo exponencial lleno de unos (como valores de infinito) y algún número distinto de cero en el campo de significado (para que sean distintos de los valores de infinito). El estándar IEEE 754 original de 1985 (IEEE 754-1985) solo describía formatos binarios de coma 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ñalando o está en silencio. Resultaron dos implementaciones diferentes, con significados inversos:

  • La mayoría de los procesadores (incluidos los de la familia Intel y AMD x86, la familia Motorola 68000, la familia AIM PowerPC, la familia ARM, la familia Sun SPARC, y opcionalmente nuevos procesadores MIPS) fijan el bit de señalización/cuidad a no cero si el NaN es silencioso, y a cero si el NaN está señalizando. Así, en estos procesadores, el bit representa un is_quiet bandera;
  • en NaNs generadas por los procesadores PA-RISC y los antiguos MIPS, la señalización/cuerpo es cero si el NaN es silencioso, y no cero si el NaN está señalizando. Así, en estos procesadores, el bit representa un is_signaling bandera.

Se prefirió la primera opción, ya que permite que la implementación silencie un NaN de señalización simplemente configurando 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

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

  • Para los formatos binarios de intercambio, la parte más significativa del campo significativo se utiliza exclusivamente para distinguir entre NaNs silenciosos y señalizantes. Además, debería ser un is_quiet bandera. Es decir, este bit no es cero si el NaN es silencioso, y cero si el NaN está señalizando.
  • Para los formatos de intercambio decimal, ya sea binario o decimal codificado, un NaN es identificado por tener los cinco primeros bits del campo de combinación después del bit de signo fijado a los. El sexto pedazo del campo es el is_signaling bandera. Es decir, este bit es cero si el NaN es silencioso, y no cero si el NaN está señalizando.

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 la versión 3 de MIPS y obligatorio en la versión 5.

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

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 tranquilo como entrada. Una opinión es que el 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 manera única por todas las entradas que no son NaN (incluido el infinito), entonces ese valor debería ser el resultado. Así, por ejemplo, el valor devuelto por hypot(±∞, qNaN) y hypot(qNaN, ±∞) es +∞.

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

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 suelen devolver 1 para pow(1, y) para cualquier número real y, e incluso cuando y es un infinito. Del mismo modo, producen 1 para pow(x, 0) incluso cuando x es 0 o un infinito. La justificación para devolver el valor 1 para las formas indeterminadas era que el valor de las funciones en puntos singulares se puede tomar como un valor particular si ese valor está en el límite el valor para todo menos una parte muy pequeña de una pelota alrededor del valor límite de los parámetros. La versión de 2008 del estándar IEEE 754 dice que pow(1, qNaN) y pow(qNaN, 0) ambos deben 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 pow(−1, ±∞) = 1 en lugar de qNaN; la razón de esta elección se da en la lógica de C: "Generalmente, C99 evita un resultado NaN donde un valor numérico es útil.... El resultado de pow(−2, ∞) es +∞, porque todos los valores grandes positivos de coma flotante son enteros pares.& #34;

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

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 requiere que se señale una excepción de operación no válida. Por ejemplo, en Java, tales operaciones generan instancias de java.lang.ArithmeticException . En C, conducen a un comportamiento indefinido, pero si se admite el anexo F, la operación produce un "no válido" excepción de punto flotante (como lo requiere el estándar IEEE) y un valor no especificado.

Perl's Math::BigInt el paquete usa "NaN" para el resultado de cadenas que no representan enteros válidos.

■ perl -mMath::BigInt -e "print Math::BigInt-provenew('foo')"Nan

Pantalla

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

nan (C, C++, Python)
NaN (ECMAScript, Rust, C#, Julia). Julia puede mostrar alternativa NaN, dependiendo de la precisión, NaN32 y NaN16; NaN es para tipo Float64.Nan
NAN (C, C++, Rust)
NaNQ (IBM XL y AIX: Fortran, C++ propuesta n2290)
NaNS (ditto)
qNan
sNan
1.#SNAN (Excel)
1.#QNAN (Excel)
-1.#IND (Excel)
+nan.0 (Scheme)

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' (a veces llamado carga útil), estos también se encontrarán ocasionalmente en representaciones de cadenas de NaN. Algunos ejemplos son:

  • Para los lenguajes C y C++, el bit de signo siempre se muestra por las funciones de biblioteca estándar (por ejemplo. -nanCuando esté presente. No hay una pantalla estándar de la carga útil ni del estado de señalización, pero un valor NaN silencioso de una carga útil específica puede ser construido al proporcionar la cadena nan(char-sequence) a una función de fijación de números (por ejemplo, strtod) o proporcionando el char-sequence cuerda nan() (o nans() sNan), ambos interpretados de manera definida en la aplicación.
    • GCC and LLVM provides built-in implementations of nan() y nans(). Ellos analizan el char-sequence como un entero para strtoull (o un equivalente de tamaño diferente) con su detección de bases enteros.
    • El programador flotador de la Biblioteca C de GNU utiliza el char-sequence cuerda en "una moda no especificada". En la práctica, este proceso ha sido equivalente a GCC/LLVM por hasta 64 bits de carga útil.
    • Newlib no implementa nan() persiguiendo, pero strtod() acepta un formato hexadecimal sin prefijo.
    • musl no implementa ninguna carga útil parsing.

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

Contenido relacionado

Tecnología MOS 65xx

La serie MOS Technology 65xx es una familia de microprocesadores de 8 bits de MOS Technology, basados en el Motorola 6800 (presentado ca. 1975). La familia...

Seguimiento de la fuente

Seguimiento de fuente se refiere a la capacidad de algunos sistemas de hipertexto para rastrear rigurosamente la fuente exacta de cada documento o documento...

Filtro de internet

Un filtro de Internet es un software que restringe o controla el contenido al que puede acceder un usuario de Internet, especialmente cuando se utiliza para...
Más resultados...
Tamaño del texto:
Copiar