OberonCore
https://forum.oberoncore.ru/

Целочисленное деление
https://forum.oberoncore.ru/viewtopic.php?f=27&t=6259
Страница 4 из 4

Автор:  Wlad [ Пятница, 12 Июль, 2019 11:45 ]
Заголовок сообщения:  Re: Целочисленное деление

Я, конечно же, дико извиняюсь за мои, традиционно, тупые вопросы, но не могло ли уважаемое собрание привести пример предметки, в которой есть неустранимая необходимость узнавать остаток от деления целых чисел разных знаков?

Автор:  Comdiv [ Пятница, 12 Июль, 2019 12:33 ]
Заголовок сообщения:  Re: Целочисленное деление

Например, распределение пикселей между визуальными элементами. Только при чём тут слово "неустранимая"? Для алгоритмической полноты нужно совсем ничего, поэтому большую часть можно устранить, в том числе и целиком деление в языке.

Автор:  kemiisto [ Пятница, 12 Июль, 2019 13:22 ]
Заголовок сообщения:  Re: Целочисленное деление

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

Автор:  Info21 [ Пятница, 12 Июль, 2019 15:23 ]
Заголовок сообщения:  Re: Целочисленное деление

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

Автор:  Wlad [ Суббота, 13 Июль, 2019 00:54 ]
Заголовок сообщения:  Re: Целочисленное деление

Comdiv писал(а):
распределение пикселей между визуальными элементами.
???

Автор:  Wlad [ Суббота, 13 Июль, 2019 01:01 ]
Заголовок сообщения:  Re: Целочисленное деление

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

Автор:  kekc_leader [ Воскресенье, 22 Январь, 2023 05:58 ]
Заголовок сообщения:  Re: Целочисленное деление

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.

Автор:  Comdiv [ Вторник, 24 Январь, 2023 17:43 ]
Заголовок сообщения:  Re: Целочисленное деление

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

Страница 4 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/