?

Log in

No account? Create an account

По следам наших выступлений - Ваши рубидии уже у кобальта во ртути

Jun. 21st, 2017

03:21 pm - По следам наших выступлений

Previous Entry Share Next Entry

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

Оказывается, случаи разные бывают, и небезызвестный компилятор с Паскаля по ошибке вычисляет остаток именно так при оптимизации константных выражений:

 PASCAL COMPILER 15.0 (15.02.82)
 00001    1  0 PROGRAM MAIN(OUTPUT);
 00001    2  1 VAR P5, M5, P3, M3: INTEGER;
 00007    3  2 BEGIN
 00010    4  2  P5:=5; P3:=3; M5:=-5; M3:=-3;
 00014    5  2  WRITELN(’           5 MOD 3 |-5 MOD 3 | 5 MOD -3 |-5 MOD -3’);
 00017    6  2  WRITELN(’ CONST’, 5 MOD 3, -5 MOD 3, 5 MOD (-3), -5 MOD (-3));
 00032    7  2  WRITELN(’  VAR ’, P5 MOD P3, M5 MOD P3, P5 MOD M3, M5 MOD M3);
 00063    8  0  END.
           *EXECUTE
           5 MOD 3 |-5 MOD 3 | 5 MOD -3 |-5 MOD -3
 CONST         2        -2        -1         1
  VAR          2         1        -1        -2

Извините, если кого обидел.

Я тут поразмыслил с анализом размерностей и решил, что ситуация, когда знак остатка совпадает со знаком частного, физического смысла не имеет. Смотрите:

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

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

This entry was originally posted at http://spamsink.dreamwidth.org/1053489.html. Please comment there using OpenID.

Comments:

From:pigdeon
Date:June 22nd, 2017 12:53 pm (UTC)
(Link)
Вообще "физический" смысл знака при делении (да и умножении) - то еще упражнение в интерпретации.
В приведенной модели, знак частного показывает, "угадали" или нет с напавлением движения. И здесь знак остатка может совпадать со знаком частного: сколько еще продолжать в ту же сторону, или всегда быть неотрицательным. В последнем случае, это чисто математическая интерпретация: а див б = ч, а мод б = р так, что: ч * б <= а, ч * б + р = а. При этом "остаток" для аргументов с разным знаком, сменяется физическим "недостатком", т.е. остатком "до" следущего целого множителя.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:June 22nd, 2017 04:00 pm (UTC)
(Link)
Сколько еще продолжать в ту же сторону - это совпадение со знаком делимого, как сказано в посте.
(Reply) (Parent) (Thread)
From:pigdeon
Date:June 22nd, 2017 06:22 pm (UTC)
(Link)
Если знак у делимого и делителя, как в примере, определяет абсолютное направление, тогда как знак у частного определяет "правильность" выбранного направления, независимо от собственно направления. Если знаки у делителя и делимого имеют разную семантику, то и знак частного меняет смысл. Но триплет {направление, направление, правильность направления} сохраняется. В этом, собственно, и состоит сложность интерпретации деления - разная "размерность" у аргументов и результата.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:June 22nd, 2017 08:11 pm (UTC)
(Link)
Я не совсем понял предполагаемую аудиторию этого комментария. Объяснять мне мой же пост уж точно нет необходимости; или это просто размышления вслух для других читателей, если они найдутся?
(Reply) (Parent) (Thread)