OberonCore

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

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




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

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Ну, это получается набор правил типа "мне так нравится".


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

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


Последний раз редактировалось Пётр Кушнир Вторник, 26 Июнь, 2018 10:35, всего редактировалось 1 раз.

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

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 710
Откуда: Псков
Trurl писал(а):
albobin писал(а):
Наверное, всё же |a MOD b| < |b|

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


Я не пытался предлагать как правильно, а только предположить, из чего получаются результаты первого поста, которые оказались коварной дезой. :)
А в реальности наверное так:
d:=a div b |d|=|a| div |b| знак(d)=знак(a)*знак(b)
r:=a mod b |r|=|a| mod |b| знак(r)=знак(b)
a=d*b+знак(d)*r
знак(x) это либо +1 либо -1

PS.
Но, похоже, всё-таки не так


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

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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Иван Денисов писал(а):
Вот в первом посте еще случилась дезинформация...
Код:
      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

Иван, это не дезинформация, это цитата из сообщения о Компонентном Паскале.
Код:
Log.Int(-5 DIV 3); Log.Ln;
эквивалентен
Код:
Log.Int(-(5 DIV 3)); Log.Ln;
а не
Код:
Log.Int((-5) DIV 3)); Log.Ln;
Это следует из синтаксиса, который задаёт правила разбора "множителей" и "слагаемых".
Возможность этой путаницы тоже занимает меня, но мне, во многом, нравится подход Оберона в котором нет одиночного минуса, и это единственное мне известное семейство языков с правильным делением отрицательного делимого, где выполняется равенство
Код:
- 5 DIV 3 = 0 - 5 DIV 3

Возможно, нужно заставить писать 0 явно, если это поможет.


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Trurl писал(а):
Кстати, в Обероне деление определено только для положительного делителя. А вот в версии 1988г было и для отрицательных.
В связи с этим я и поднимаю вопрос. В трансляторе Восток я решил навести порядок с делением и сделал(но не выложил) запрет на отрицательный делитель. Согласно описанию это неопределённое поведение, которое я по возможности воплощаю в виде ошибки.

Но хочу развеять сомнения. Может кто-то использует отрицательный делитель, который имеет неясный для меня физический смысл.


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

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

Применяем "очевидные следствия"
5 DIV 3 = 1
(-5) DIV 3 = -(5 DIV 3) = -1
5 DIV (-3) = -(5 DIV 3) = -1


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
В pdf версии русского перевода затесалась ошибка
https://oberoncore.ru/_media/wiki/lang/report_cp_rus.pdf
Цитата:
Заметим, что:
(-5) DIV 3 = -2, но (-5) DIV 3 = -(5 DIV 3) = -1
Должно быть так:
Цитата:
Заметим, что:
(-5) DIV 3 = -2, но -5 DIV 3 = -(5 DIV 3) = -1

В html версии - http://www.inr.ac.ru/~info21/cpascal/cp ... .4_rus.htm всё правильно


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Пётр Кушнир писал(а):
Арифметика очень простая, минус на минус дает плюс, минус на плюс дает минус, умножение это n сложений, деление это n вычитаний по дороге к нулю (с любой стороны). Кажется, так. А как у вас из -5 по дороге к нулю оказалось -3 дважды я даже и не знаю.

Всё дело в том, что арифметика проистекает не из вольных размышлений, а из необходимости решения практических задач в историческом порядке.

Натуральные числа возникли из необходимости посчитать количество предметов. Отрицательные - как выражение отъёма натурального количества.
Если делите поровну прибыль, то каждому придётся удовольствоваться 1 = 5 DIV 3, потому что суммарная распределённая прибыль не может быть больше целой.
Если делите поровну убыль, то каждому придётся отдать -2 = -5 DIV 3, потому что суммарная распределённая убыль не может быть по модулю меньше целой
Это касается хоть распределения пикселей между объектами на экране, хоть собиранием денег на общий подарок (если трое собирают деньги на покупку(-) 5-и рублёвого предмета (-5), скинуться(-) придётся по 2-а (-2), а не по 1-му).


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

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


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

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

Применяем "очевидные следствия"
5 DIV 3 = 1
(-5) DIV 3 = -(5 DIV 3) = -1
5 DIV (-3) = -(5 DIV 3) = -1

И что не так? Деление столбиком так и работает. Дроби так и работают. Последовательное вычитание так и работает. И только у программистов работает не так.


Последний раз редактировалось Пётр Кушнир Вторник, 26 Июнь, 2018 12:36, всего редактировалось 1 раз.

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

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Comdiv писал(а):
(если трое собирают деньги на покупку(-) 5-и рублёвого предмета (-5), скинуться(-) придётся по 2-а (-2), а не по 1-му).

Получится -6, вы же понимаете? Не -5.
Comdiv писал(а):
Всё дело в том, что арифметика проистекает не из вольных размышлений, а из необходимости решения практических задач в историческом порядке.
Арифметика уже проистекла. Правила уже давно известны. И да, не надо умничать, все в курсе, что округлять отрицательные числа можно в разные стороны. Речь же идёт не про округление, а про операции DIV/MOD и всю ту чушь, которую вокруг этого наворотили Умные Программисты.


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

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


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Пётр Кушнир писал(а):
И да, не надо умничать, все в курсе, что округлять отрицательные числа можно в разные стороны. Речь же идёт не про округление, а про операции DIV/MOD и всю ту чушь, которую вокруг этого наворотили Умные Программисты.
Какие Умные Программисты? Те, что создавали Оберон определили, что
Код:
(-5) DIV 3 = -2

Те, что создавали процессоры Intel и те, что стандартизировали язык Си, определили
Код:
(-5) / 3 == -1

Вам не по душе вариант, котороый наворотил Вирт? Ничего страшного в этом нет, но при чём тут умничание? Я работаю над транслятором Оберона, а не Си, и пытаюсь прояснить моменты в этом контексте.


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

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

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Пётр Кушнир писал(а):
И только у программистов работает не так.

Почему же? У программистов на си работает именно так.

А вот у простых людей, работающих в Excel, не так. :wink:


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

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Тоже в тему, уже постил:
В чем разница между получением остатка от деления и взятия модуля?


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

Зарегистрирован: Вторник, 27 Февраль, 2018 09:18
Сообщения: 73
Kemet писал(а):

Там куча воды.

В Wikipedia написано по делу: https://en.wikipedia.org/wiki/Modulo_operation


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Comdiv писал(а):
Возможно, нужно заставить писать 0 явно, если это поможет.

Спасибо за разъяснение. Действительно я перепутал порядок применения знака. В первом сообщении всё корректно.

Ну а деление на отрицательный делитель, ИМХО, всё таки имеет смысл в случае указания направления. Будь то направление движения денег, как в первом примере или направления поворота или движения чего-либо, как во втором.

Еще один пример. У нас есть 10 тонн мусора. Сколько требуется вывезти трехтонных грузовиков, чтобы всё отправить на свалку?
10 DIV (-3) = -4


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

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 710
Откуда: Псков
А если переформулировать так - за сколько ходок на полигон трёхтонный грузовик вывезет 10 т мусора ? :)


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
albobin писал(а):
А если переформулировать так - за сколько ходок на полигон трёхтонный грузовик вывезет 10 т мусора ? :)

Я привык как в физике: сначала пишешь, что дано, а потом уже, что требуется найти :)
Правильно было бы так.
Дано: 10 тонн мусора и трехтонный грузовик.
Найти: количество рейсов, которое необходимо совершить для вывоза всего мусора на свалку этим грузовиком.


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

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 710
Откуда: Псков
осталось только дописать
Решение: ...
И как оно будет выглядеть? 10 DIV (-3) ?
:)


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

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


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

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


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

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