Когда брать по модулю отрицательные числа имеет смысл? - PullRequest
2 голосов
/ 15 ноября 2011

Мне любопытно, потому что мы нашли ошибку в нашем коде, написанном 2 года назад. Мы инициализировали 16-битное целое число со знаком с 0x8000 (платформа, конечно, использует представление дополнения 2 для отрицательных чисел). В едва воспроизводимом особом случае по этой переменной выполнялось по модулю 10 для извлечения отдельных цифр в десятичном представлении, пока значение все еще равно 0x8000 (-32768). -32768% 10 == 248, что не имеет смысла для нашего приложения.

Нашей платформой является микроконтроллер OKI 411.

Мне любопытно, хотя взятие по модулю отрицательного числа в этом случае не имеет смысла, есть ли реальный жизненный пример или практическая причина или как-то получить выгоду, взяв по модулю отрицательное число?

1 Ответ

5 голосов
/ 15 ноября 2011

Мне нужно было дать более полный ответ.

Как вы говорите, математически имеет смысл (хотя вам не нужно быть математиком, чтобы понять это), но позвольте мне кое-что прояснить.Когда я сказал, что вы заинтересованы в остатке, что правда, можно ошибочно думать, что остатки для положительных (a mod n) или отрицательных (-a mod n) чисел совпадают, потому что можно наивно сбросить знак и нестина деление в отрицательном случае.Конечно, теперь вы знаете, что это не правильно.Вы можете думать об этом следующим образом: при вычислении a mod n сначала вы узнаете, какое число n*x (где x - целое число) ближе всего к a, не превышая a.После этого вы посчитаете, сколько чисел существует между n*x и a.Здесь может помочь пример:

Предположим, вы хотите -282 mod 10, тогда 10 * -29 = -290 будет ближайшим к -282, не переходя его.И тогда вы просто посчитаете, сколько чисел находится между n*x и a (то есть между 290 и 282).Всего 8 цифр, и это ваш ответ, который правильный .С другой стороны, для положительных чисел (282 mod 10) ближайшее число к 282 будет 10 * 28 = 280 (помните, что мы не хотим переходить через 282).Следовательно, между ними есть 2 числа (также правильно ).

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

Относительно вашего программирования woes:

Когда a или n отрицательны, это наивное определение не работает, и языки программирования различаются по тому, как эти значения определены.Хотя обычно они выполняются с целыми числами a и n, многие вычислительные системы допускают другие типы числовых операндов.

См. Также this .

...