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

Javascript: Является ли это подлинно подписанным целым подразделением?

Учитывая следующий код, где оба a и b являются Number, представляющими значения в диапазоне подписанных 32-разрядных целых чисел:

var quotient = ((a|0) / (b|0))|0;

и считая, что время выполнения полностью соответствует спецификациям ECMAScript 6, будет ли значение quotient всегда правильным целочисленным делением a и b в качестве целых чисел? Другими словами, является ли это подходящим методом для достижения истинного знакового целочисленного деления в JavaScript, эквивалентного машинной команде?

4b9b3361

Ответ 1

Я не эксперт по числам с плавающей запятой, но Wikipedia говорит, что удваивает 52 бит точности. Логически кажется, что 52 бит должно быть достаточно, чтобы надежно аппроксимировать целочисленное деление 32-битных целых чисел.

Разделение минимальных и максимальных 32-битных подписанных ints -2147483648 / 2147483647 создает -1.0000000004656613, который по-прежнему является разумным количеством значимых цифр. То же самое относится к его обратному выражению 2147483647 / -2147483648, который производит -0.9999999995343387.

Исключение составляет деление на ноль, о котором я упоминал в комментарии. Поскольку связанный запрос SO указывает, что целочисленное деление на ноль обычно вызывает какую-то ошибку, тогда как приведение в плавающей запятой приводит к (1 / 0) | 0 == 0.

Обновление: В соответствии с другим SO-ответом целочисленное деление в C усекается к нулю, что и есть |0 в JavaScript. Кроме того, деление на 0 равно undefined, поэтому JavaScript технически неверен при возврате нуля. Если я ничего не пропустил, ответ на исходный вопрос должен быть да.

Обновление 2: Соответствующие разделы спецификации ECMAScript 6: как делить числа и как преобразовать в 32-разрядное целое число со знаком, которое что |0 делает.