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: Целочисленное деление

Обоснование есть, но несколько произвольное. Потребуем, чтобы выполнялись два условия:
  1. (a DIV b)*b + (a MOD b) = a
  2. |a MOD b| <= |b|
Вот второе условия кажется искусственным.
Другой популярный способ обоснования (и определения) - выполнять операции над вещественными числами и аппроксимировать результаты целыми. Но поскольку способов аппроксимации несколько, легко обосновать разные результаты.

Практического применения я не встречал и не уверен, что смогу придумать.

Автор:  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/