Операция JavaScript по модулю
Успешная реализация научного расчета или алгоритма возможна не только благодаря пониманию особенностей, которые предлагает конкретный язык или структура, но также понимая ограничения.
Компьютеры точнынаучные инструменты, но они работают, манипулируя объектами в дискретных пространствах (у вас есть ограниченное количество пикселей на экране, есть ограниченное количество битов, которые находятся за каждым числом и т. д.)
Попробуйте игнорироватьограничений или спецификаций структуры, и вскоре вы обнаружите, что у вас есть несоответствие импеданса между вашей математической формулой и кодом, который вы пытаетесь написать.
Оператор по модулю
Иногда ситуации осложняютсяложно рекламируемые или понятые каркасные функции или операторы.Эта статья посвящена оператору по модулю.
Спросите любого программиста на C # или JavaScript, что такое оператор по модулю в их языке, и есть большая вероятность, что он ответит:% (например, знак процента).Большое количество документации относится к знаку% как оператору по модулю.
Ух ты!Это тонкая, но очень опасная ошибка.В C # и JavaScript оператор% используется фактически для вычисления остатка (со знаком), оставшегося, когда один операнд делится на второй операнд.Поэтому операнд должен правильно называться оператором остатка со знаком.
На первый взгляд, оператор остатка со знаком работает аналогично оператору по модулю.Давайте проведем несколько тестов, сравнив результаты, возвращаемые JavaScript, с результатами, возвращенными Google.
В Chrome откройте консоль (нажмите F12 и выберите вкладку Консоль).Введите один за другим вычисления из левого столбца.Далее введите те же выражения в строке поиска Google.Обратите внимание на результаты.Они должны быть одинаковыми.
JavaScript Google
5 % 3 2 2
26 % 26 0 0
15 % 12 3 3
Давайте теперь попробуем использовать отрицательное значение в качестве первого операнда:
Surprise!
-5% 3 = 1 (в соответствии с Google) -5% 3 = -2 (в соответствии с JavaScript)
Ну ... это не должно быть сюрпризом, если мы посмотрим наопределение оператора% в JavaScript (… или даже в C # или во многих других языках).Google вычисляет истинное значение по модулю, в то время как эти компьютерные языки рассчитывают напоминание со знаком.
Однако не все языки программирования / платформы имеют одинаковую реализацию для%.Например, в Python оператор% вычисляет истинное значение по модулю так же, как Google.
Эта разница в поведении между языками может привести к незначительнымошибки в ваших вычислениях, особенно если вы пытаетесь перенести алгоритм с одного языка на другой!
Понятная проблема - это наполовину решенная проблема
Предположим, нам нужно реализовать (научный)вычисления в JavaScript с использованием арифметики по модулю.
Поскольку теперь мы понимаем, что JavaScript не имеет истинного оператора по модулю, мы можем легко реализовать нашу операцию по модулю как функцию.
Существует несколько способовреализовать по модулю в JavaScript.Я покажу вам 3 способа сделать это.
// Implement modulo by replacing the negative operand
// with an equivalent positive operand that has the same wrap-around effect
function mod(n, p)
{
if ( n < 0 )
n = p - Math.abs(n) % p;
return n % p;
}
// Implement modulo by relying on the fact that the negative remainder
// is always p numbers away from a positive reminder
// Ex: -5 % 3 | -5 = -2 * 3 + 1 and -5 = -1 * 3 + (-2) | -2 + 3 = 1
function mod(n, p)
{
var r = n % p;
return r < 0 ? r + p : r;
}
// Implement modulo by solving n = v * p + r equation
function mod(n, p)
{
return n - p * Math.floor( n / p );
}
Имея в своем распоряжении более точные инструменты, мы теперь готовы приступить к этим (научным) расчетам и рассчитывать на получение правильных результатов каждый раз.
Примечание. Существует множество вычислений, использующих арифметику по модулю ... Если вы хотите узнать, как использовать эти новые функции по модулю при реализации кода Caesar Cipher / ROT13, вы можете проверить эту статью .