Se dice en Wikipedia que los números representables entre 2⁵³ ~ 2⁵⁴ son todos números enteros pares.
Si hacemos let N = Number.MAX_SAFE_INTEGER (que es 2⁵³ - 1 = 9007199254740991), y calculamos los siguientes números: N+2 , N+2.0000000000000001 , N+2.000000000000001 , esperaría que fueran todos iguales, pero me equivoqué :
N + 2 === 9007199254740992 N + 2.0000000000000001 === 9007199254740992 N + 2.000000000000001 === 9007199254740994¿Alguien sabe por qué?
El primer número tiene un componente de punto subdecimal que requiere 2^-56 exponente:
<<< '2.0000000000000001' gawk -v PREC=2000000 -nMbe '{ printf("\n\t0x%.16A\n\n",($0)%1) }' 0x 7.34ACA5F6226F0ADAp-56el último 1 en la cola se perderá incluso durante el análisis, lo que significa que solo le está pidiendo que maneje
[ 4^3^3/2 - 1 ] (ps:: this is my favorite way to express 2^53-1) + 2lo cual supongo que la lógica de punto flotante de doble precisión por defecto no lo redondea. Pero a la inversa, el segundo ejemplo que proporcionó tiene un componente subdecimal que es
0x 4.80EBE7B9D58566C8 p-52 ie 0.00000000000000 10000000000 0.000000000000000 2220446049 (~2^-52) Combining both, what the floating point system sees is 0x 2.000000000000 0 p+0 <~~~ 1st one 0x 2.000000000000 5 p+0 <~~~ 2nd one / This 5 made all the differenceahora la mantisa tiene algo que usar para redondear las cosas.