javascript node.js math v8 infinity

javascript - ¿Por qué node no evalúa Math.tan(Math.PI/2) a Infinity pero Chrome V8 lo hace?



math.atan2 javascript (4)

Cuando se ejecuta esto en una interfaz de línea de comandos de nodo:

> Math.tan(Math.PI/2) 16331778728383844

Pero en Chrome:

> Math.tan(Math.PI/2) Infinity

¿No están usando ambos el mismo motor V8?

El resultado del nodo no es ni siquiera igual al valor máximo de "entero" en JavaScript .



La cosa es que, el servidor tiene diferentes configuraciones de un navegador. Infinity es la variable "Number.POSITIVE_INFINITY" pero si compruebas otra variable, el "Number.MAX_INTEGER" que da mi chrome:

console.log( Number.MAX_INTEGER ) // prints 9007199254740991

y 9007199254740991 es más pequeño que 16331778728383844, por lo que probablemente Chrome decida que todos los números más grandes que Number.MAX_INTEGER sean Infinito.

En el nodo js console.log (Number.MAX_INTEGER) // imprime 1.7976931348623157e + 308

Chrome y node js tienen diferentes límites ascendentes y descendentes para Números.

En resumen, en nodejs Number.MAX_INTEGER es más grande que Math.tan(Math.PI/2) mientras que Chrome ''s Number.MAX_INTEGER es más pequeño que Math.tan(Math.PI/2) .

Así que nodejs ve un número, mientras que Chrome ve Infinity .


Si escribe:

Math.PI/2

¿Obtienes exactamente π / 2? Nope;)

Por lo tanto, no puede calcular "con precisión" Math.tan(Math.PI/2) como Infinity porque no tiene la precisión para Math.PI/2 .

Pero en algunos casos (como Chrome), la pérdida de precisión es tan pequeña que, de todos modos, alcanza el Infinity .

Para ilustrar esto, eche un vistazo a este resultado de la consola:

Math.PI/2 > 1.5707963267948966 Math.tan(1.5707963267948964) > 5039790063769915 Math.tan(1.5707963267948965) > Infinity Math.tan(1.5707963267948966) > Infinity Math.tan(1.5707963267948967) > -5039790063769915

¿Observa cómo en realidad hay dos valores que resultan en Infinity ? Esa es la inexactitud.


Si observa la implementación v8 del objeto Math , verá:

function MathTan(x) { return MathSin(x) / MathCos(x); }

De hecho, Math.cos(Math.PI/2) devuelve un valor inusual en Node (de hecho, el recíproco de su inusual resultado Math.tan ):

> Math.cos(Math.PI/2) 6.123031769111886e-17 // in Chrome, this is 0

Entonces, su pregunta se reduce a: ¿Por qué Math.cos(Math.PI/2) no es cero en el nodo <= 0.10.24?

Esto es difícil de contestar. La implementación de sine y cosine se proporciona mediante una función matemática que se llama TrigonometricInterpolation , que se basa en una tabla de búsqueda inversa de 1800 valores de muestra generados por el código C ++, código que a su vez genera un script de Python cuando se instala v8 por primera vez .

Sin embargo, también es importante tener en cuenta que el código de la tabla de búsqueda trigonométrica actual reemplazó muy recientemente a una tabla de búsqueda anterior , por lo que la versión actual de Node puede no estar utilizando la tabla de búsqueda trigonométrica más reciente (desde que el nuevo código llegó a la v8 el 22 de noviembre). , 2013, pero el único tirón de v8 a Node antes de la versión 0.10.24 en diciembre de 2013 fue el 11 de noviembre de 2013, once días antes del cambio). Chrome probablemente está usando un código actualizado, mientras que el Nodo estable actual está usando un código trigonométrico diferente.