Программистское
Jun. 7th, 2010 12:59 amС подачи
А каким должен быть знак остатка, если хотя бы одно из чисел, участвующих в операции, отрицательное?
Кроме очевидных вариантов "всегда неотрицательный", "соответствующий знаку делителя" и "соответствующий знаку делимого" (все эти варианты представлены в разнообразных языках программирования, хотя "всегда неотрицательный" и непопулярен), есть и еще один: знак остатка от деления X на Y, если он не равен нулю, соответствует знаку произведения X на Y. Если бы в языке INTERCAL было целочисленное деление, оно бы, наверное, было определено именно так.
Интересно, можно ли придумать такому определению остатка полезное применение?
Upd: В Architecture Neutral Distribution Format одно из определений деления с остатком именно такое: http://docs.tendra.org/reference/xhtml/guide/ch08.html#S69
no subject
Date: 2010-06-07 08:12 am (UTC)no subject
Date: 2010-06-07 08:30 am (UTC)Этот вариант тоже есть - mod0 в Scheme, но tie break все равно куда-то должен быть.
no subject
Date: 2010-06-07 09:17 am (UTC)no subject
Date: 2010-06-07 09:21 am (UTC)В mzscheme mod0 выдает отрицательное значение
Интересно, зачем?
no subject
Date: 2010-06-07 09:20 pm (UTC)no subject
Date: 2010-06-11 04:45 am (UTC)no subject
Date: 2010-06-15 11:31 pm (UTC)Где ц.частное есть целочисленное частное; вопрос в том, как его определять в случае отрицательного делимого и/или делителя.
Я считаю необходимым рассматривать целочисленное частное в тесной связи с рациональным частным; так, одному и тому же рациональному частному должно соответствовать одно и то же целочисленное частное.
Так, для одновременно отрицательных делимого и делителя получаем:
−10 / (−3) = 3,(3);
ц.частное = 3 (поскольку ц.частное для 10 / 3 = 3,(3) есть 3);
остаток = −10 − ((−3) ⋅ 3) = −1.
Это умозаключение опровергает правило, согласно которому знак остатка соответствует знаку произведения.
Проблема возникает, если знак делимого противоположен знаку делителя. Для −10 / 3 = −3,(3) за целочисленное частное можно взять как −3, так и −4. Причём я не вижу оснований предпочитать одно другому.
Если ц.частное = −3, то остаток = −10 − (3 ⋅ (−3)) = −1.
Если ц.частное = −4, то остаток = −10 − (3 ⋅ (−4)) = 2.
Для противоположного случая:
10 / (−3) = −3,(3).
Если ц.частное = −3, то остаток = 10 − ((−3) ⋅ (−3)) = 1.
Если ц.частное = −4, то остаток = 10 − ((−3) ⋅ (−4)) = −2.
Видим, что если брать за целочисленное частное, соответствующее рациональному частному −3,(3), число −3, то знак остатка соответствует знаку делимого, а если −4 — то знаку делителя.