OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 11:09

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 68 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Целочисленное деление
СообщениеДобавлено: Воскресенье, 24 Июнь, 2018 23:14 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
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

Есть обоснования, почему для отрицательного делителя должны быть такие результаты? Симметрия?
Вообще, насколько отрицательный делитель для целых чисел оправдан? Сам сходу не могу вспомнить, чтобы я использовал целочисленное деление на отрицательное число, и не могу придумать физический смысл этого, в то время как с отрицательным делимым всё логично.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Понедельник, 25 Июнь, 2018 10:36 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Понял смысл:

5 DIV -3 = -2
Сколько раз нужно отдать по три штуки (-3), чтобы у другого человека оказалось 5 штук?
Отдать надо 2 раза (-2), и получится, что один был отдан лишний (-1).
5 MOD -3 = -1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Понедельник, 25 Июнь, 2018 10:44 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
-5 DIV -3 = -1
Есть долг (-5). Сколько целых выплат нужно совершить по 3 (-3). Одну выплату (1). Ну и останется долг (-2).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Понедельник, 25 Июнь, 2018 11:52 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Высшая арифметика, учебник для программистов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Понедельник, 25 Июнь, 2018 12:01 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Иван Денисов писал(а):
Сколько раз нужно отдать по три штуки (-3)
В том-то и дело, что по три - это (+3), а не (-3). Для отрицательного делителя нацело нужно что-то другое, так как "отдать" относится к делимому.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Понедельник, 25 Июнь, 2018 13:30 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Понедельник, 25 Июнь, 2018 13:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Чтобы сохранялась формула: остаток + делитель * DIV = делимое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Понедельник, 25 Июнь, 2018 16:48 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 710
Откуда: Псков
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Понедельник, 25 Июнь, 2018 23:37 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Те условия, что указали 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 равных частей, то отрицательное количество частей выглядит странно. Но возможно есть другой физический смысл?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 00:27 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Люди, вы чего...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 01:05 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Пётр, просто напишите свой очевидный ответ.
Есть здесь физический смысл, или сделано ради симметрии? В каких задачах Вы используете отрицательный делитель?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 07:26 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Comdiv писал(а):
Иван Денисов писал(а):
Сколько раз нужно отдать по три штуки (-3)
В том-то и дело, что по три - это (+3), а не (-3). Для отрицательного делителя нацело нужно что-то другое, так как "отдать" относится к делимому.

Не согласен. Отдать относится к делителю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 07:35 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Приведем еще пример не из области финансов, а из области автоматизации.
У нас есть заслонка и шаговый двигатель, который может сдвигать положение заслонки только на три градуса.
Задача держать заслонку в районе 0 градусов. Детектор показывает, что положение заслонки -5 градусов.

Сколько шагов должен сделать шаговый двигатель, чтобы приблизить к нулю со отрицательной стороны?
-5 DIV -3 = 1 шаг по часовой
и отклонение составит -2 градуса.

Сколько шагов должен сделать шаговый двигатель, чтобы приблизить к нулю с положительной стороны?
-5 DIV 3 = -2 шага по часовой
и отклонение составит 1 градус.


Последний раз редактировалось Иван Денисов Вторник, 26 Июнь, 2018 08:28, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 08:28 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Comdiv писал(а):
Пётр, просто напишите свой очевидный ответ.

Арифметика очень простая, минус на минус дает плюс, минус на плюс дает минус, умножение это n сложений, деление это n вычитаний по дороге к нулю (с любой стороны). Кажется, так. А как у вас из -5 по дороге к нулю оказалось -3 дважды я даже и не знаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 08:33 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Вот в первом посте еще случилась дезинформация...

Код:
      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


Последний раз редактировалось Иван Денисов Вторник, 26 Июнь, 2018 08:40, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 08:37 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
albobin писал(а):
Наверное, всё же |a MOD b| < |b|

Нет, я хотел написать 0 <= a MOD b < |b|. (но попытался сократить на ходу и, как обычно, напутал)
Ваши условия тоже неплохи, но дают другое определение.


Последний раз редактировалось Trurl Вторник, 26 Июнь, 2018 09:21, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 08:42 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Comdiv писал(а):
Вопрос мой сугубо практический. Если отрицательный делитель не имеет практической ценности и не встречается в корректных, не замудренных программах, то хотелось бы исключить возможность такого деления, также, как и деления на ноль.


Кстати, в Обероне деление определено только длч положительного делителя. А вот в версии 1988г было и для отрицательных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 09:22 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Пётр Кушнир писал(а):
деление это n вычитаний по дороге к нулю (с любой стороны)

А что такое n вычитаний при n<0?
И чем вычитание по дороге к нулю отличается от просто вычитания?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 09:28 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
n<0 не бывает :) потому что умножение(я) на минус 1 выносится вперед и там сидит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 26 Июнь, 2018 09:32 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Trurl писал(а):
И чем вычитание по дороге к нулю отличается от просто вычитания?
Геометрически.
Тем, что от -5 до нуля 5 шагов, шо так, шо этак, и три шага можно пройти всего один раз.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 68 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB