OberonCore

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

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




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

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


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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
Сообщения: 248
Откуда: г. Рига, Латвийская ССР
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
Сообщения: 1412
Откуда: Киев
kekc_leader писал(а):
Это показывает, почему язык Оберон определяет остаток от деления как всегда неотрицательный (и меньший делимого).
Было бы печально, если бы это было причиной. Это удачное совпадение, а настоящая, вероятно, в следовании традиционной целочисленной арифметике, которая диктуется историей введения и физическим смыслом. Отрицательные числа возникли для обозначения отнимания. Невозможно взять пять предметов (-5) равными частями из 3-х корзин, взяв по одному (-1) и получив два отрицательных предмета (-2) в остатке. Зато можно, взяв по два (-2) и получив 1 предмет, разумеется, в положительном остатке.


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

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


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

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


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

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