Почему C++ выводит отрицательные числа при использовании по модулю?

Математика:

Если у вас есть такое уравнение:

x = 3 mod 7

х может быть... -4, 3, 10, 17,... или в более общем случае:

x = 3 + k * 7

где k может быть любым целым числом. Я не знаю, определена ли операция по модулю для математики, но факторкольцо определенно определено.

Питон:

В Python вы всегда будете получать не -отрицательные значения, когда используете %с положительнымm:

#!/usr/bin/python
# -*- coding: utf-8 -*-

m = 7

for i in xrange(-8, 10 + 1):
    print(i % 7)

Результаты в:

6    0    1    2    3    4    5    6    0    1    2    3    4    5    6    0    1    2    3

С++:

#include 

using namespace std;

int main(){
    int m = 7;

    for(int i=-8; i <= 10; i++) {
        cout << (i % m) << endl;
    }

    return 0;
}

Выведет:

-1    0    -6    -5    -4    -3    -2    -1    0    1    2    3    4    5    6    0    1    2    3    

ИСО/МЭК 14882 :2003 (Е)-5.6 Мультипликативные операторы:

The binary / operator yields the quotient, and the binary % operator yields the remainder from the division of the first expression by the second. If the second operand of / or % is zero the behavior is undefined; otherwise (a/b)*b + a%b is equal to a. If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined 74).

и

74) According to work underway toward the revision of ISO C, the preferred algorithm for integer division follows the rules defined in the ISO Fortran standard, ISO/IEC 1539:1991, in which the quotient is always rounded toward zero.

Источник:ИСО/МЭК 14882 :2003 (E)

(Я не смог найти бесплатную версию ISO/IEC 1539:1991. Кто-нибудь знает, откуда его взять?)

Операция, по-видимому, определяется так:

enter image description here

Вопрос:

Имеет ли смысл так определять?

Каковы аргументы в пользу этой спецификации? Есть ли место, где люди, создающие такие стандарты, обсуждают это? Где я могу прочитать что-нибудь о причинах, почему они решили сделать это таким образом?

В большинстве случаев, когда я использую модуль, я хочу получить доступ к элементам структуры данных. В этом случае я должен убедиться, что мод возвращает не -отрицательное значение. Итак, в этом случае было бы хорошо, если бы мод всегда возвращал не -отрицательное значение. (Другим вариантом использования является алгоритм Евклида . Поскольку вы могли бы сделать оба числа положительными перед использованием этого алгоритма, знак по модулю будет иметь значение.)

Дополнительный материал:

См. Википедия для получения длинного списка того, что модуль делает на разных языках.

52
задан Martin Thoma 24 July 2012 в 00:54
поделиться