español ejemplos descargar definicion curso caracteristicas javascript

javascript - ejemplos - ¿Son+0 y-0 lo mismo?



javascript html (8)

Agregaré esto como respuesta porque pasé por alto el comentario de @ user113716.

Puede probar -0 al hacer esto:

function isMinusZero(value) { return 1/value === -Infinity; } isMinusZero(0); // false isMinusZero(-0); // true

Al leer la especificación ECMAScript 5.1 , se distinguen entre +0 y -0 .

¿Por qué entonces +0 === -0 evalúa a true ?


En el estándar IEEE 754 utilizado para representar el tipo de Número en JavaScript, el signo se representa con un bit (un 1 indica un número negativo).

Como resultado, existe un valor negativo y uno positivo para cada número representable, incluido 0 .

Es por eso que existen -0 y +0 .


Hay dos valores posibles (representaciones de bits) para 0. Esto no es único. Especialmente en números de coma flotante esto puede ocurrir. Esto se debe a que los números de coma flotante en realidad se almacenan como un tipo de fórmula.

Los enteros se pueden almacenar de manera separada también. Puede tener un valor numérico con un bit de signo adicional, por lo que en un espacio de 16 bits, puede almacenar un valor entero de 15 bits y un bit de signo. En esta representación, el valor 1000 (hex) y 0000 ambos son 0, pero uno de ellos es +0 y el otro es -0.

Esto podría evitarse restando 1 del valor entero para que varíe de -1 a -2 ^ 16, pero esto sería inconveniente.

Un enfoque más común es almacenar enteros en ''dos ​​complementos'', pero aparentemente ECMAscript ha elegido no hacerlo. En este método, los números oscilan entre 0000 y 7FFF positivos. Los números negativos comienzan en FFFF (-1) a 8000.

Por supuesto, las mismas reglas se aplican a los enteros más grandes también, pero no quiero que se desgaste mi F. ;)


JavaScript usa el estándar IEEE 754 para representar números. De la Wikipedia :

El cero firmado es cero con un signo asociado. En aritmética ordinaria, -0 = +0 = 0. Sin embargo, en computación, algunas representaciones numéricas permiten la existencia de dos ceros, a menudo denotados por -0 (cero negativo) y +0 (cero positivo) . Esto ocurre en algunas representaciones de números firmados para enteros y en la mayoría de las representaciones de números de coma flotante. El número 0 generalmente se codifica como +0, pero se puede representar con +0 o -0.

El estándar IEEE 754 para aritmética de coma flotante (actualmente utilizado por la mayoría de las computadoras y lenguajes de programación que admiten números en coma flotante) requiere tanto de +0 como de -0. Los ceros se pueden considerar como una variante de la recta numérica real extendida de modo que 1 / -0 = -∞ y 1 / + 0 = + ∞, la división por cero solo está indefinida para ± 0 / ± 0 y ± ∞ / ± ∞ .

El artículo contiene más información sobre las diferentes representaciones.

Esta es la razón por la cual, técnicamente, se deben distinguir ambos ceros.

Sin embargo, +0 === -0 evalúa como verdadero. Porqué es eso (...) ?

Este comportamiento se define explícitamente en la sección 11.9.6 , el Algoritmo de comparación de igualdad estricta (énfasis en parte mío):

La comparación x === y , donde y son valores, produce verdadero o falso . Tal comparación se realiza de la siguiente manera:

(...)

  • Si Type (x) es Number, entonces

    1. Si x es NaN, devuelve falso.
    2. Si y es NaN, devuelve falso.
    3. Si x es el mismo valor numérico que y, devuelve verdadero.
    4. Si x es +0 e y es -0, devuelve verdadero.
    5. Si x es -0 e y es +0, devuelve verdadero.
    6. Falso retorno.

(...)

(Lo mismo vale para +0 == -0 btw).

Parece lógicamente tratar +0 y -0 como iguales. De lo contrario, tendríamos que tener esto en cuenta en nuestro código y, personalmente, no quiero hacer eso;)

Nota:

ES2015 presenta un nuevo método de comparación, Object.is . Object.is distingue explícitamente entre -0 y +0 :

Object.is(-0, +0); // false


Podemos usar Object.is para distinguir +0 y -0, y una cosa más, NaN==NaN .

Object.is(+0,-0) //false Object.is(NaN,NaN) //true


Responder el título original Are +0 and -0 the same? :

brainslugs83 (en comentarios de respuesta de Spudley ) señaló un caso importante en el que +0 y -0 en JS no son lo mismo, implementado como función:

var sign = function(x) { return 1 / x === 1 / Math.abs(x); }

Esto, además del Math.sign estándar, devolverá el signo correcto de +0 y -0.


Wikipedia tiene un buen artículo para explicar este fenómeno: http://en.wikipedia.org/wiki/Signed_zero

En resumen, tanto +0 como -0 se definen en las especificaciones de punto flotante IEEE. Ambos son técnicamente distintos de 0 sin un signo, que es un número entero, pero en la práctica todos evalúan a cero, por lo que la distinción se puede ignorar para todos los propósitos prácticos.


Yo lo culparía por el método de Comparación de Igualdad Estricta (''===''). Mira la sección 4d

ver 7.2.13 Comparación estricta de igualdad en la specification