Lectura a través de la especificación ECMAScript 5.1 , +0
y -0
se distinguen.
¿Por qué entonces +0 === -0
evalúa a true
?
javascript
Randomblue
fuente
fuente
Object.is
para distinguir +0 y -0Respuestas:
JavaScript utiliza el estándar IEEE 754 para representar números. De Wikipedia :
El artículo contiene más información sobre las diferentes representaciones.
Entonces esta es la razón por la cual, técnicamente, ambos ceros tienen que distinguirse.
Este comportamiento se define explícitamente en la sección 11.9.6 , Algoritmo estricto de comparación de igualdad (el énfasis es parcialmente mío):
(Lo mismo vale para
+0 == -0
BTW).Parece lógicamente tratar
+0
e-0
igual. De lo contrario, tendríamos que tener esto en cuenta en nuestro código y yo, personalmente, no quiero hacer eso;)Nota:
ES2015 introduce un nuevo método de comparación,
Object.is
.Object.is
distingue explícitamente entre-0
y+0
:fuente
1/0 === Infinity; // true
y1/-0 === -Infinity; // true
.1 === 1
y+0 === -0
pero1/+0 !== 1/-0
. ¡Que raro!+0 !== -0
;) Eso realmente podría crear problemas.0 !== +0
/0 !== -0
, lo que de hecho también crearía problemas.Agregaré esto como respuesta porque pasé por alto el comentario de @ user113716.
Puede probar para -0 haciendo esto:
fuente
e±308
su número solo puede representarse en forma desnormalizada y las diferentes implementaciones tienen diferentes opiniones sobre dónde apoyarlas o no. El punto es que, en algunas máquinas en algunos modos de coma flotante, su número se representa como-0
y en otras como número desnormalizado0.000000000000001e-308
. Tales carrozas, tan divertidoAcabo de encontrar un ejemplo donde +0 y -0 se comportan de manera muy diferente:
Tenga cuidado: incluso cuando use Math.round en un número negativo como -0.0001, en realidad será -0 y puede arruinar algunos cálculos posteriores como se muestra arriba.
Una forma rápida y sucia de solucionar esto es hacer algo como:
o solo:
Esto convierte el número a +0 en caso de que fuera -0.
fuente
En el estándar IEEE 754 utilizado para representar el tipo de Número en JavaScript, el signo está representado por un bit (un 1 indica un número negativo).
Como resultado, existe un valor tanto negativo como positivo para cada número representable, incluido
0
.Esta es la razón por tanto
-0
y+0
existir.fuente
Respondiendo el título original
Are +0 and -0 the same?
:brainslugs83
(en comentarios de respuesta porSpudley
) señaló un caso importante en el que +0 y -0 en JS no son lo mismo, implementado como función:Esto, además del estándar,
Math.sign
devolverá el signo correcto de +0 y -0.fuente
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 se almacenan realmente como una especie de fórmula.
Los enteros también se pueden almacenar por separado. 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 (hexadecimal) y 0000 son ambos 0, pero uno de ellos es +0 y el otro es -0.
Esto podría evitarse restando 1 del valor entero para que oscilara entre -1 y -2 ^ 16, pero esto sería inconveniente.
Un enfoque más común es almacenar números enteros en 'dos complementos', pero aparentemente ECMAscript ha elegido no hacerlo. En este método, los números varían de 0000 a 7FFF positivo. Los números negativos comienzan en FFFF (-1) a 8000.
Por supuesto, las mismas reglas se aplican también a los enteros más grandes, pero no quiero que mi F se desgaste. ;)
fuente
+0 === -0
un poco raro. Porque ahora tenemos1 === 1
y+0 === -0
pero1/+0 !== 1/-0
...+0 === -0
pesar de que las representaciones de dos bits son diferentes.Podemos utilizar
Object.is
para distinguir 0 y -0, y una cosa más,NaN==NaN
.fuente
Lo culparía del método de comparación estricta de igualdad ('==='). Mira la sección 4d
ver 7.2.13 Comparación estricta de igualdad en la especificación
fuente
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 coma flotante IEEE. Ambos son técnicamente distintos de 0 sin signo, que es un número entero, pero en la práctica todos se evalúan a cero, por lo que la distinción puede ignorarse a todos los efectos prácticos.
fuente