остаток от целочисленного деления на 0 - PullRequest
4 голосов
/ 08 апреля 2011

Рассмотрим целочисленное деление

a = bq + r

где a, b, q, r соответственно: дивиденд, делитель, частное и остаток. В частности, когда b = 0, не существует уникального q, которое удовлетворяет уравнению для данного a, и, следовательно, имеет смысл, что частное q в этом случае должно быть неопределенным.

Однако в таком случае действительно существует единственный r, а именно r = a. Исходя из предположения, что частное и остаток всегда определяются вместе, из этого следует, что r не определяется, когда q не определено, но в программировании мы часто хотим использовать операцию остатка % независимо от деления /. Я действительно столкнулся с ситуацией, когда я хочу if b == 0 then a else a % b end.

Есть ли / был ли оператор в любом языке программирования такой, что он такой же, как %, но возвращает дивиденд вместо ошибки деления на ноль, когда делитель равен 0?

Есть ли причина, по которой большинство (или все) языков программирования возвращают ошибку деления на ноль для % 0?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Есть ли язык программирования, который возвращает дивиденды? Точно сказать не могу. Я никогда не сталкивался ни с чем.

Есть ли причина, по которой большинство не возвращает дивиденды? Да . Модуль является распространенной операцией в CS, потому что он является побочным продуктом целочисленного деления на процессоре. Большинство (если не все) языки ассемблера имеют операцию модуля, и эта операция использует точно такое же аппаратное обеспечение, что и операция деления. Таким образом, если вы не можете делить на ноль в аппаратных средствах, то вы не можете сделать модуль ноль в аппаратных средствах.

Значит ли это, что у вас нет языка, который бы это поддерживал? Не совсем, но вы должны добавить оператор if к операции, которая обычно представляет собой одну инструкцию. Это может привести к довольно сильному падению производительности, поэтому немногие (если таковые имеются) делают это.

2 голосов
/ 08 апреля 2011

Математически, остаток находится между 0 и b-1, где b - делитель. Следовательно, когда b = 0, r не определено, поскольку должно быть> = 0.

...