Category:

По следам наших выступлений

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

Оказывается, случаи разные бывают, и небезызвестный компилятор с Паскаля по ошибке вычисляет остаток именно так при оптимизации константных выражений:
 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.