остаток от деления на 0

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

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?


person sawa    schedule 08.04.2011    source источник
comment
Знаешь, сегодня утром я задавался вопросом, может ли Чак Норрис вычислить логарифм нуля...   -  person Andrew Grimm    schedule 08.04.2011
comment
Интересный вопрос. Схема (или хитрость, во всяком случае) имеет функции remainder и modulo (они различаются, когда аргументы отрицательные, кстати). Оба они переполняются на 0.   -  person drysdam    schedule 08.04.2011
comment
Дивидент должен быть, дивиденд. Кроме того, я думаю, вы имеете в виду, что делитель равен 0, а не частное. Частное является результатом деления и равно нулю, если делимое меньше делителя (для чисел без знака). В этом случае остаток будет равен дивиденду. Когда делитель равен нулю, частное не определено, и неясно, что умножение неопределенного числа на ноль равно нулю, поэтому остаток также не должен быть определен.   -  person pat    schedule 08.04.2011
comment
Теперь вам нужно сказать, что не существует уникального q, удовлетворяющего уравнению.   -  person pat    schedule 08.04.2011
comment
Ну, я сказал, что непонятно про ноль, умноженный на неопределенное значение. Настоящим аргументом является то, что r должно быть меньше b в соответствии с определением деления.   -  person pat    schedule 08.04.2011
comment
@pat Это мой вопрос. Даже когда нет уникального «q», есть уникальное «r», и разве мы не можем определить последнее независимо от уникальности первого? Хорошо, ваш более поздний комментарий более убедителен.   -  person sawa    schedule 08.04.2011
comment
@Grimm Я понимаю, что log0 должен быть неопределенным, как и /0. Но я думал, что %0 может быть независимым от них.   -  person sawa    schedule 08.04.2011
comment
Я действительно не думаю, что можно утверждать, что 0, умноженный на что-либо, равно нулю. /а>. Однако, обходя этот аргумент, частное и остаток должны удовлетворять двум условиям; a = bq + r и 0 ‹= r ‹ b. Установка b = 0, r = a удовлетворяет первому условию (опять же, игнорируя тот факт, что q не определено), но не второму.   -  person pat    schedule 08.04.2011
comment
@pat Спасибо. Ваш комментарий столь же убедителен, как и комментарий пользователя 677480. (Я все еще думаю, что ноль умножить на любое число равно нулю, но я написал что-то не так в своем предыдущем комментарии, поэтому я удалил его.)   -  person sawa    schedule 08.04.2011
comment
Обычно величина остатка от деления всегда меньше величины делителя (см., например, этот сюжет). Определение остатка как делителя, когда делитель равен нулю, нарушит это правило.   -  person HelloGoodbye    schedule 09.09.2015
comment
@AndrewGrimm Я отправляю это сообщение из 2017 года назад шесть лет назад, чтобы сообщить вам, что Чак Норрис уже не такой крутой. В следующем году (2012) он заявит, что если Обама будет переизбран, США погрузится в 1000-летнюю тьму (никто из нас не уверен, что он имел в виду это как своего рода эвфемизм). Обама действительно победил, так что сейчас идет шестой год. (Вот как это работает, верно? Он увидит мой ответ еще в 2011 году?)   -  person Trixie Wolf    schedule 04.01.2017
comment
Реализация алгоритма деления, который не проверяет /0, фактически возвращает то, что вы пишете, в этом случае дивиденд является остатком.   -  person Calmarius    schedule 02.03.2018


Ответы (2)


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

person pjwilliams    schedule 08.04.2011
comment
Ах да, это ключевой недостающий оператор, 0 ‹= r ‹ b. Без ограничения на r было бы бесконечное число частных. - person pat; 08.04.2011
comment
@ user677480, @pat Спасибо за ответ. Я по неосторожности забыл об этом состоянии. Теперь ясно. - person sawa; 08.04.2011

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

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

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

person riwalk    schedule 08.04.2011
comment
Спасибо за ответ. Проблема его реализации стала достаточно ясной. - person sawa; 08.04.2011
comment
Операция модуль/остаток чаще всего используется для проверки того, является ли некоторое число x кратным некоторому числу y. В таких случаях представляет интерес не точное возвращаемое значение, а то, равно ли оно нулю. Ноль кратен нулю (единственное кратное нулю), и применение определения деления таким образом, что а/0 дает частное нуля, а остаток от а, позволит нормальному методу проверки x кратно y работать гладко в все случаи, включая ноль. - person supercat; 14.11.2013
comment
@supercat, никто не пытается сгладить деление на ноль. Если вам нужно особым образом обработать деление на ноль, используйте оператор if. Modulus работает именно так, потому что он эффективен. Если вам нужно сделать больше, то существует множество программных конструкций, которые помогут вам в этом. - person riwalk; 14.11.2013
comment
@ Stargazer712: Я понимаю, что многие поставщики оборудования решили, что лучше иметь ловушку деления на ноль, чем просто ничего не делать, кроме установки флага, и, как следствие, это позволяет любое предсказуемое поведение в делении целых чисел. Сценарий с нулевым значением был бы более затратным, чем оставить его UB (относительная стоимость, вероятно, была бы меньше, чем требуемая, чтобы даже когда y было постоянным, x/y должно было усекаться до нуля, а x%y должно совпадать со знаком x, но будут затраты). Моя точка зрения заключалась в том, что x mod 0 не является бессмысленной концепцией, хотя если бы я проектировал... - person supercat; 14.11.2013
comment
...язык программирования Я бы, вероятно, ограничил тестирование mod-zero оператором, кратным оператору. При проверке, является ли x кратным некоторому произвольному y, стоимость проверки нуля может быть компенсирована отсутствием необходимости корректировать значение x%y, если x отрицательно. - person supercat; 14.11.2013