Является ли Math.floor (x / y) детерминированным? - PullRequest
0 голосов
/ 22 февраля 2019

Согласно этой записи , числа с плавающей точкой в ​​JavaScript не являются детерминированными.

Интересно, является ли следующий код детерминированным?

z = Math.floor(x/y)

Если нет, как я могу выполнить детерминированное целочисленное деление в JavaScript?

Редактировать: Я хотел бы знатьмогу ли я рассчитывать на то, что полученное значение будет одинаковым в разных реализациях JavaScript (если они соответствуют стандартам).

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Должно быть детерминированным.

Согласно спецификации

20.2.2.16 Math.floor (x)

Возвращаетнаибольшее (самое близкое к + ∞) числовое значение, которое не больше x и равно математическому целому числу.Если x уже является целым числом, результат равен x.

  • Если x равен NaN, результат равен NaN.
  • Если x равен +0, результат равен + 0.
  • Если x равен −0, результат равен −0.
  • Если x равен + ∞, результат равен + ∞.
  • Если x равен −∞, результат равен−∞.
  • Если x больше 0, но меньше 1, результат равен + 0.

NOTE Значение Math.floor (x) совпадает со значением -Math.ceil (-x).

Недетерминизм некоторых математических функций связан с возможными проблемами округления, когда базовый движок использует числа с более высокой точностью,Это не должно быть фактором здесь.

Обновление :

Деление также детерминированное .Здесь спецификация JS зависит от спецификации IEEE 754.Но эта спецификация является детерминированной.(Извините, нет ссылки, так как фактическая спецификация является платной.)

Недетерминирован в менее распространенных функциях JS.

0 голосов
/ 23 февраля 2019

Да.Math.floor всегда возвращает самое низкое значение integer .

В то время как это не является детерминированным: z = 3/1.5; //z !== 2

По конструкции функции это: z = Math.floor(3/1.5); //z === 2

Подробнее см. Документы MDN .

...