OberonCore https://forum.oberoncore.ru/ |
|
Целочисленное деление https://forum.oberoncore.ru/viewtopic.php?f=27&t=6259 |
Страница 1 из 4 |
Автор: | Comdiv [ Воскресенье, 24 Июнь, 2018 23:14 ] |
Заголовок сообщения: | Целочисленное деление |
Info21 писал(а): Разве десятичную позиционную нотацию развивают? Как раз хотелось бы прояснить кое-что.В Компонентном Паскале, в Pyhon, Tcl и многих других языках целочисленное деление приводит к таким результатам. Код: x y x DIV y x MOD y 5 3 1 2 -5 3 -2 1 5 -3 -2 -1 -5 -3 1 -2 Есть обоснования, почему для отрицательного делителя должны быть такие результаты? Симметрия? Вообще, насколько отрицательный делитель для целых чисел оправдан? Сам сходу не могу вспомнить, чтобы я использовал целочисленное деление на отрицательное число, и не могу придумать физический смысл этого, в то время как с отрицательным делимым всё логично. |
Автор: | Иван Денисов [ Понедельник, 25 Июнь, 2018 10:36 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Понял смысл: 5 DIV -3 = -2 Сколько раз нужно отдать по три штуки (-3), чтобы у другого человека оказалось 5 штук? Отдать надо 2 раза (-2), и получится, что один был отдан лишний (-1). 5 MOD -3 = -1 |
Автор: | Иван Денисов [ Понедельник, 25 Июнь, 2018 10:44 ] |
Заголовок сообщения: | Re: Целочисленное деление |
-5 DIV -3 = -1 Есть долг (-5). Сколько целых выплат нужно совершить по 3 (-3). Одну выплату (1). Ну и останется долг (-2). |
Автор: | Пётр Кушнир [ Понедельник, 25 Июнь, 2018 11:52 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Высшая арифметика, учебник для программистов. |
Автор: | Comdiv [ Понедельник, 25 Июнь, 2018 12:01 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Иван Денисов писал(а): Сколько раз нужно отдать по три штуки (-3) В том-то и дело, что по три - это (+3), а не (-3). Для отрицательного делителя нацело нужно что-то другое, так как "отдать" относится к делимому.
|
Автор: | Trurl [ Понедельник, 25 Июнь, 2018 13:30 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Обоснование есть, но несколько произвольное. Потребуем, чтобы выполнялись два условия:
Другой популярный способ обоснования (и определения) - выполнять операции над вещественными числами и аппроксимировать результаты целыми. Но поскольку способов аппроксимации несколько, легко обосновать разные результаты. Практического применения я не встречал и не уверен, что смогу придумать. |
Автор: | Info21 [ Понедельник, 25 Июнь, 2018 13:49 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Чтобы сохранялась формула: остаток + делитель * DIV = делимое. |
Автор: | albobin [ Понедельник, 25 Июнь, 2018 16:48 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Trurl писал(а): |a MOD b| <= |b| Наверное, всё же |a MOD b| < |b| Может проще так. для положительных b: 0<= (a MOD b) <b (остаток >=0), и (a DIV b) *b <= a для отрицательных b: b< (a MOD b) <=0 (остаток <=0), и (a DIV b) *b >= a |
Автор: | Comdiv [ Понедельник, 25 Июнь, 2018 23:37 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Те условия, что указали Trurl и Info21 выполняются как для Код: x y x DIV y x MOD y так и для5 -3 -2 -1 -5 -3 1 -2 Код: x y x DIV y x MOD y 5 -3 -1 2 -5 -3 2 1 Расписанные условия от albobin добавляют требование, что ненулевой остаток должен иметь тот же знак, что делитель. Но ничто не объясняет почему. Поскольку изначальный смысл целочисленного деления - это разбивка на N равных частей, то отрицательное количество частей выглядит странно. Но возможно есть другой физический смысл? Вопрос мой сугубо практический. Если отрицательный делитель не имеет практической ценности и не встречается в корректных, не замудренных программах, то хотелось бы исключить возможность такого деления, также, как и деления на ноль. Это может дополнительно позволить отлавливать некоторые ошибки на более ранней стадии. Если же есть какой-то не очевидный мне смысл в отрицательном делителе, то, конечно, оно должно быть позволено. |
Автор: | Пётр Кушнир [ Вторник, 26 Июнь, 2018 00:27 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Люди, вы чего... |
Автор: | Comdiv [ Вторник, 26 Июнь, 2018 01:05 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Пётр, просто напишите свой очевидный ответ. Есть здесь физический смысл, или сделано ради симметрии? В каких задачах Вы используете отрицательный делитель? |
Автор: | Иван Денисов [ Вторник, 26 Июнь, 2018 07:26 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Comdiv писал(а): Иван Денисов писал(а): Сколько раз нужно отдать по три штуки (-3) В том-то и дело, что по три - это (+3), а не (-3). Для отрицательного делителя нацело нужно что-то другое, так как "отдать" относится к делимому.Не согласен. Отдать относится к делителю. |
Автор: | Иван Денисов [ Вторник, 26 Июнь, 2018 07:35 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Приведем еще пример не из области финансов, а из области автоматизации. У нас есть заслонка и шаговый двигатель, который может сдвигать положение заслонки только на три градуса. Задача держать заслонку в районе 0 градусов. Детектор показывает, что положение заслонки -5 градусов. Сколько шагов должен сделать шаговый двигатель, чтобы приблизить к нулю со отрицательной стороны? -5 DIV -3 = 1 шаг по часовой и отклонение составит -2 градуса. Сколько шагов должен сделать шаговый двигатель, чтобы приблизить к нулю с положительной стороны? -5 DIV 3 = -2 шага по часовой и отклонение составит 1 градус. |
Автор: | Пётр Кушнир [ Вторник, 26 Июнь, 2018 08:28 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Comdiv писал(а): Пётр, просто напишите свой очевидный ответ. Арифметика очень простая, минус на минус дает плюс, минус на плюс дает минус, умножение это n сложений, деление это n вычитаний по дороге к нулю (с любой стороны). Кажется, так. А как у вас из -5 по дороге к нулю оказалось -3 дважды я даже и не знаю. |
Автор: | Иван Денисов [ Вторник, 26 Июнь, 2018 08:33 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Вот в первом посте еще случилась дезинформация... Код: Log.Int(5 DIV 3); Log.Ln; Log.Int(-5 DIV 3); Log.Ln; Log.Int(5 DIV (-3)); Log.Ln; Log.Int(-5 DIV (-3)); Log.Ln; Возвращает Код: 1
-1 -2 2 |
Автор: | Trurl [ Вторник, 26 Июнь, 2018 08:37 ] |
Заголовок сообщения: | Re: Целочисленное деление |
albobin писал(а): Наверное, всё же |a MOD b| < |b| Нет, я хотел написать 0 <= a MOD b < |b|. (но попытался сократить на ходу и, как обычно, напутал) Ваши условия тоже неплохи, но дают другое определение. |
Автор: | Trurl [ Вторник, 26 Июнь, 2018 08:42 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Comdiv писал(а): Вопрос мой сугубо практический. Если отрицательный делитель не имеет практической ценности и не встречается в корректных, не замудренных программах, то хотелось бы исключить возможность такого деления, также, как и деления на ноль. Кстати, в Обероне деление определено только длч положительного делителя. А вот в версии 1988г было и для отрицательных. |
Автор: | Trurl [ Вторник, 26 Июнь, 2018 09:22 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Пётр Кушнир писал(а): деление это n вычитаний по дороге к нулю (с любой стороны) А что такое n вычитаний при n<0? И чем вычитание по дороге к нулю отличается от просто вычитания? |
Автор: | Пётр Кушнир [ Вторник, 26 Июнь, 2018 09:28 ] |
Заголовок сообщения: | Re: Целочисленное деление |
n<0 не бывает потому что умножение(я) на минус 1 выносится вперед и там сидит. |
Автор: | Пётр Кушнир [ Вторник, 26 Июнь, 2018 09:32 ] |
Заголовок сообщения: | Re: Целочисленное деление |
Trurl писал(а): И чем вычитание по дороге к нулю отличается от просто вычитания? Геометрически. Тем, что от -5 до нуля 5 шагов, шо так, шо этак, и три шага можно пройти всего один раз. |
Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |