По следам наших выступлений
Jun. 21st, 2017 03:21 pmМного лет назад я задавался вопросом (или тут), бывает ли такое в жизни, чтобы целочисленное деление отрицательного числа на отрицательное давало положительный остаток.
Оказывается, случаи разные бывают, и небезызвестный компилятор с Паскаля по ошибке вычисляет остаток именно так при оптимизации константных выражений:
Извините, если кого обидел.
Я тут поразмыслил с анализом размерностей и решил, что ситуация, когда знак остатка совпадает со знаком частного, физического смысла не имеет. Смотрите:
Если тебе надо пройти 5 метров на юг трехметровыми шагами, а ты стоишь лицом к северу, то логично будет, если остаток пути надо делать
- или всегда в ту же сторону света, в какую делал шаги; неважно лицом вперед или пятился (сделал один шаг на юг, и еще надо 2 метра на юг, знак остатка равен знаку делимого),
- или всегда вперед (сделал два шага пятясь, и еще метр вперед, знак остатка равен знаку делителя),
- или, так уж и быть, всегда на север (остаток всегда неотрицательный).
А вот логика, что если ты ходил вперед, то остаток должен быть к северу, а если пятился, то к югу (знак остатка равен знаку частного), мне была бы непонятна.
Оказывается, случаи разные бывают, и небезызвестный компилятор с Паскаля по ошибке вычисляет остаток именно так при оптимизации константных выражений:
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 метра на юг, знак остатка равен знаку делимого),
- или всегда вперед (сделал два шага пятясь, и еще метр вперед, знак остатка равен знаку делителя),
- или, так уж и быть, всегда на север (остаток всегда неотрицательный).
А вот логика, что если ты ходил вперед, то остаток должен быть к северу, а если пятился, то к югу (знак остатка равен знаку частного), мне была бы непонятна.
no subject
Date: 2017-06-21 11:56 pm (UTC)Остроконечники против тупоконечников
Date: 2017-06-22 01:48 am (UTC)no subject
Date: 2017-06-22 01:56 am (UTC)А вообще напоминает мой любимый анекдот про отрицательную посещаемость лекций: сидят на лекции два студента; вдруг трое встают и выходят. Профессор вздыхает и говорит: ну вот, сейчас еще один придет, тогда вообще ни одного не останется.
no subject
Date: 2017-06-22 02:26 am (UTC)Re: Остроконечники против тупоконечников
Date: 2017-06-22 02:27 am (UTC)Также см. апдейт.
no subject
Date: 2017-06-22 02:29 am (UTC)А не между КР и (К+A/abs(A))P?
Также см. апдейт.
Re: Остроконечники против тупоконечников
Date: 2017-06-22 02:58 am (UTC)То есть это не так страшно, как undefined behavior, но просто раз проверить и надеяться на то, что так будет всегда - опрометчиво.
Re: Остроконечники против тупоконечников
Date: 2017-06-22 03:03 am (UTC)no subject
Date: 2017-06-22 04:01 am (UTC)no subject
Date: 2017-06-22 04:09 am (UTC)no subject
Date: 2017-06-22 05:44 am (UTC)no subject
Date: 2017-06-22 05:46 am (UTC)Java:
И в чем сюрприз?
no subject
Date: 2017-06-22 06:37 am (UTC)no subject
Date: 2017-06-22 06:46 am (UTC)no subject
Date: 2017-06-22 07:02 am (UTC)no subject
Date: 2017-06-22 03:13 pm (UTC)no subject
Date: 2017-06-24 04:44 pm (UTC)