Подтвердить что ты не робот

Почему node не оценивает Math.tan(Math.PI/2) для Infinity, но Chrome V8 делает?

При запуске в интерфейсе командной строки node:

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

Но в Chrome:

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

Не оба ли они используют тот же двигатель V8?

Результат

Node не равен значению максимум "integer" в JavaScript.

4b9b3361

Ответ 1

Если вы посмотрите v8 реализацию объекта Math, вы увидите:

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

Действительно, Math.cos(Math.PI/2) также возвращает необычное значение в Node (фактически, обратное вашему необычному результату Math.tan):

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

Итак, ваш вопрос сводится к: Почему Math.cos(Math.PI/2) ненулевое значение в Node <= 0.10.24?

Трудно ответить. Реализация синуса и косинуса обеспечивается математической функцией, называемой TrigonometricInterpolation, которая основана на таблице обратного поиска из 1800 полученных значений выборки кодом С++, который сам генерирует Python script, когда v8 впервые установлен.

Также стоит отметить, что текущий код таблицы поиска триггеров совсем недавно заменил старую таблицу поиска, поэтому текущая версия Node может не использовать самую последнюю таблицу поиска триггеров (поскольку новый код прибыл в v8 22 ноября 2013 года, но единственное вытащить из v8 в Node до выпуска 0.10.24 в декабре 2013 года был 11 ноября 2013 года, за одиннадцать дней до изменения). Chrome, вероятно, использует обновленный код, а текущий стабильный Node использует разные тригонометрические коды.

Ответ 2

Дело в том, что у сервера разные настройки из браузера. Infinity - это переменная "Number.POSITIVE_INFINITY", но если вы проверите другую переменную, "Number.MAX_INTEGER" мой хром дает:

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

и 9007199254740991 меньше, чем 16331778728383844, поэтому, вероятно, хром решает каждое число, большее, чем Number.MAX_INTEGER, быть бесконечным.

В node js console.log(Number.MAX_INTEGER)//печатает 1.7976931348623157e + 308

Chrome и node js имеет разные верхние и нижние пределы для номеров.

Подводя итог, на nodejs Number.MAX_INTEGER больше Math.tan(Math.PI/2) а хром Number.MAX_INTEGER меньше Math.tan(Math.PI/2).

Значит nodejs видит число, а хром - бесконечность.

Ответ 3

Если вы наберете:

Math.PI/2

Вы получаете точно & pi;/2? Нет);

Поэтому он не может "точно" вычислить Math.tan(Math.PI/2) как Infinity, потому что он не имеет точности для Math.PI/2.

Но в некоторых случаях (например, в Chrome) потеря точности настолько мала, что в любом случае она получает Infinity.

Чтобы проиллюстрировать это, взгляните на этот вывод консоли:

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

Обратите внимание, как на самом деле есть два значения, которые приводят к Infinity? Это неточность.