Согласованное целочисленное деление с операциями с плавающей запятой - PullRequest
4 голосов
/ 31 мая 2011

Мне нужно сделать целочисленное деление в JavaScript, которое дает мне только числа с плавающей запятой двойной точности для работы.Обычно я просто делаю Math.floor(a / b) (или a / b | 0) и выполняю его, но в этом случае я выполняю симуляцию, выполняемую в режиме lockstep, и мне необходимо обеспечить согласованность между машинами и средами выполнения независимо от того, используют ли они 64-битную или80-битная внутренняя точность.

До сих пор я не заметил каких-либо несоответствий, но не смог убедительно убедить себя в том, что они не могут произойти.Так что мне интересно:

  1. Предполагая, что a и b являются целыми числами в диапазоне 0..2 ^ 31-1 и 1..2 ^ 31-1 соответственно,гарантируется ли согласованность результатов JavaScript Math.floor(a / b)a / b | 0) на всех машинах и во время выполнения?

  2. Почему или почему нет?

1 Ответ

2 голосов
/ 31 мая 2011

Я думаю, что нет.И ответом будет то, что это зависит от ряда факторов:

  1. Реализации сценариев ECMA от поставщика для браузера.

  2. Независимо от того,версия ECMA Script определяет этот уровень согласованности (обычно нет).

  3. Другие, внешние факторы на компьютерах конечных пользователей, о которых вы можете не знать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...