OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 14 Февраль, 2026 02:04

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




Начать новую тему Ответить на тему  [ Сообщений: 75 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Пятница, 12 Июль, 2019 11:45 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Я, конечно же, дико извиняюсь за мои, традиционно, тупые вопросы, но не могло ли уважаемое собрание привести пример предметки, в которой есть неустранимая необходимость узнавать остаток от деления целых чисел разных знаков?


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1475
Откуда: Киев
Например, распределение пикселей между визуальными элементами. Только при чём тут слово "неустранимая"? Для алгоритмической полноты нужно совсем ничего, поэтому большую часть можно устранить, в том числе и целиком деление в языке.


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

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
Нашёл статью в русской Педивикии. Там есть и список по языкам и пара примеров, где нужно неполное частное округлять и к нулю, и к минус бесконечности. :) Вот ещё на аглицком о том же.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Wlad писал(а):
Я, конечно же, дико извиняюсь за мои, традиционно, тупые вопросы, но не могло ли уважаемое собрание привести пример предметки, в которой есть неустранимая необходимость узнавать остаток от деления целых чисел разных знаков?
Некоторые типы расчётов для пресловутого БАКа в ЦЕРНе. Для скорости и упрощения управления памятью вместо полной целой арифметики произвольной точности на промежуточных шагах используется арифметика чисел по модулю большого простого числа. Это большие расчёты, и чисто арифметическая часть там сильно доминирует.


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

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Comdiv писал(а):
распределение пикселей между визуальными элементами.
???


Последний раз редактировалось Wlad Суббота, 13 Июль, 2019 01:01, всего редактировалось 1 раз.

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

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Info21 писал(а):
Некоторые типы расчётов для пресловутого БАКа в ЦЕРНе. Для скорости и упрощения управления памятью вместо полной целой арифметики произвольной точности на промежуточных шагах используется арифметика чисел по модулю большого простого числа. Это большие расчёты, и чисто арифметическая часть там сильно доминирует.
Ой, не пугайте меня! Или кто-то таки решил сингулярность породить? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Воскресенье, 22 Январь, 2023 05:58 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 249
Откуда: г. Рига, Латвийская ССР
kemiisto писал(а):
...Вот ещё на аглицком о том же.


В этой статье есть два интересных фрагмента:

Здесь говорится о том, что при компиляции выражения x MOD y (где y — константа) компилятор может применить простую оптимизацию в случае, если делитель есть степень двойки. Это простая оптимизация, наподобие свёртывания констант. В компиляторах Вирта всегда реализованы такие оптимизации. Оптимизация состоит в следующем. Вместо того, чтобы выдавать машинный код деления, выдаётся код поразрядной операции И на величину, на единицу меньшую, чем делитель: x AND (y - 1). Оптимизация срабатывает и в том случае, если делимое отрицательно.

Однако, если в языке программирования операции деления с остатком определены так, что остаток от деления имеет знак делимого (как в стандарте Си с 1999 года и почти во всех языках), таковая оптимизация оказывается невозможной.

Цитата:
Compiler optimizations may recognize expressions of the form expression % constant where constant is a power of two and automatically implement them as expression & (constant-1), allowing the programmer to write clearer code without compromising performance. This simple optimization is not possible for languages in which the result of the modulo operation has the sign of the dividend (including C), unless the dividend is of an unsigned integer type. This is because, if the dividend is negative, the modulo will be negative, whereas expression & (constant-1) will always be positive.

Это показывает, почему язык Оберон определяет остаток от деления как всегда неотрицательный (и меньший делимого).

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

Цитата:
When the result of a modulo operation has the sign of the dividend (truncated definition), it can lead to surprising mistakes.

For example, to test if an integer is odd, one might be inclined to test if the remainder by 2 is equal to 1:

Код:
bool is_odd(int n) {
    return n % 2 == 1;
}

But in a language where modulo has the sign of the dividend, that is incorrect, because when n (the dividend) is negative and odd, n mod 2 returns −1, and the function returns false.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Вторник, 24 Январь, 2023 17:43 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1475
Откуда: Киев
kekc_leader писал(а):
Это показывает, почему язык Оберон определяет остаток от деления как всегда неотрицательный (и меньший делимого).
Было бы печально, если бы это было причиной. Это удачное совпадение, а настоящая, вероятно, в следовании традиционной целочисленной арифметике, которая диктуется историей введения и физическим смыслом. Отрицательные числа возникли для обозначения отнимания. Невозможно взять пять предметов (-5) равными частями из 3-х корзин, взяв по одному (-1) и получив два отрицательных предмета (-2) в остатке. Зато можно, взяв по два (-2) и получив 1 предмет, разумеется, в положительном остатке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Среда, 11 Февраль, 2026 09:57 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 92
С точки зрения здравого смысла, при любых знаках делимого и делителя дробный результат деления надо всегда округлять к нулю, а не к бесконечности, потому что все числа, как положительные, так и отрицательные, отсчитываются от нуля. Поэтому остаток всегда должен иметь знак делимого. Житейский пример - делим на троих пять положительных яблок, получаем каждому по положительному яблоку и два положительных яблока в остатке. Но если делить отрицательные яблоки, то получается каждому по два отрицательных яблока и одно положительное яблоко (непонятно, откуда взявшееся) в запасе. И при общем суммировании придется объяснять про аннигиляцию положительного и отрицательного яблока.
По поводу отрицательного частного или отрицательного делителя тоже можно придумать простую аналогию - идти можно как лицом вперед, так и вперед спиной либо в сторону положительной бесконечности, либо в сторону отрицательной бесконечности.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Среда, 11 Февраль, 2026 10:16 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1692
с точки зрения здравого смысла минус пять яблок не существует, и никакие операции над ними невозможны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Среда, 11 Февраль, 2026 13:46 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 92
arisu писал(а):
с точки зрения здравого смысла минус пять яблок не существует, и никакие операции над ними невозможны.

Тогда попробуйте повернуть влево рисунок в любом графическом редакторе, если программист ограничил величину угла поворота рисунка в 180 градусов, а рисунок надо повернуть на -90, то есть 270 градусов.
Или будильник, который с 9 часов утра надо переставить на 8 часов утра, и в силу отсутствия отрицательных значений изменения его надо прокрутить вперед на 23 часа.
Работать это будет, но удобства людям мало.
А ограничение на остаток, которое в том числе определяет величину частного, в виде 0<=r (остаток)<|a| (делитель) носит такой же формальный характер, как и ограничение такого вида 0<=|r|<|a|


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Среда, 11 Февраль, 2026 16:37 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1692
я совершенно не понял, каким образом мы перешли к модульной арифметике (которой в обероне по умолчанию нет, кстати). минус пять яблок это не помогает представить никак.

зато вот с точки зрения моего здравого смысла floored division обладает как минимум двумя прекрасными свойствами. во первых, вне зависимости от знака divisor, выражение `quot * divisor <= dividend` всегда правдиво. во вторых, арифметический сдвиг вправо работает точно так же, как деление на соответствующую степень двойки (а «выдвинутые» биты дают правильный остаток).

рассуждать же о том, как правильно с точки зрения «здравого смысла» оперировать минус пятью яблоками, лучше под присмотром крепких санитаров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Среда, 11 Февраль, 2026 18:02 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 92
Если вы не признаете отрицательных делимых и делителей - это ваше личное мнение.
Ваша floored division в случае отрицательного частного выполняет дополнительную работу по вычитанию 1 из результата, что отразится на скорости выполнения программы.
На пассаж о крепких санитарах я отвечать не буду - я привык к дискуссиям с большей аргументированностью.

Засим дискуссию с вами я прекращаю по причине полного отсутствия аргументов с вашей стороны (ваше личное мнение не в счет).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Среда, 11 Февраль, 2026 18:16 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1692
а, понятно. «с точки зрения здравого смысла есть минус пять яблок» — это не личное мнение, а Мощный Аргумент. согласен: нам не о чем говорить — ни сейчас, ни вообще.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Целочисленное деление
СообщениеДобавлено: Четверг, 12 Февраль, 2026 08:15 

Зарегистрирован: Суббота, 30 Июль, 2022 12:02
Сообщения: 92
Паскаль 1970 года - div - division with truncation, функция trunc - отсечение дробной части вне зависимости от знака (округление к нулю)
Паскаль 1972 года - здесь в функции trunc отсечение дробной части для отрицательных чисел идет с округлением к минус бесконечности, то есть trunc(-3.2)=-4
Паскаль 1973 года - здесь без примеров говорится, что в функции trunc отсекается дробная часть - видимо, с округлением к нулю
Стандарт Паскаля - функция trunc отсекает дробную часть (округление к нулю)
Модула-2 1978 года, где нет вещественных чисел, DIV - отсечение дробной части (округление к нулю)
Модула-2 1980 года - DIV - отсечение дробной части (округление к нулю), хотя процедура TRUNC имеет результатом тип CARDINAL, то есть используется только для положительных чисел
Модула-2 1988 года - здесь нет упоминания о знаках делителя и делимого, но наложено условие, что остаток x MOD y всегда положителен. Процедура TRUNC имеет результатом тип INTEGER, то есть применяется и для отрицательных, и для положительных чисел
В стандарте Модулы-2 есть оба типа целочисленного деления, цитата: Операции, представляемые символами "/" и "REM", осуществляют такое деление произвольного делимого на ненулевой делитель, что остаток от этого деления имеет тот же знак, что и делимое, а операции, представляемые символами "DIV" и "MOD", осуществляют такое деление произвольного делимого на положительный делитель, что остаток от этого деления неотрицателен
В Обероне уже чётко оговорено, что делитель всегда положителен, и остаток всегда положителен


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

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


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

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


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

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