Dlaczego C ++ generuje liczby ujemne podczas używania modulo?
Matematyka:
Jeśli masz takie równanie:
x = 3 mod 7
x może być ... -4, 3, 10, 17, ... lub bardziej ogólnie:
x = 3 + k * 7
gdzie k może być dowolną liczbą całkowitą. Nie znam operacji modulo zdefiniowanej dla matematyki, ale pierścień czynników jest z pewnością.
Pyton:
W Pythonie zawsze używasz wartości nieujemnych%
z pozytywemm
:
#!/usr/bin/python
# -*- coding: utf-8 -*-
m = 7
for i in xrange(-8, 10 + 1):
print(i % 7)
Prowadzi do:
6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3
C ++:
#include <iostream>
using namespace std;
int main(){
int m = 7;
for(int i=-8; i <= 10; i++) {
cout << (i % m) << endl;
}
return 0;
}
Wyjdzie:
-1 0 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 0 1 2 3
ISO / IEC 14882: 2003 (E) - 5,6 Operatorzy multiplikatywni:
Operator binary / daje iloraz, a operator binary% daje resztę z podziału pierwszego wyrażenia przez drugie. Jeśli drugi operand / lub% ma wartość zero, zachowanie jest niezdefiniowane; w przeciwnym razie (a / b) * b + a% b jest równe a. Jeśli oba operandy są nieujemne, to reszta jest nieujemna; Jeśli nie,znak pozostałej części jest zdefiniowany przez implementację 74).
i
74) Zgodnie z trwającymi pracami nad rewizją ISO C, preferowany algorytm dla podziału całkowitego jest zgodny z zasadami określonymi w normie ISO Fortran, ISO / IEC 1539: 1991, w której iloraz jest zawsze zaokrąglany do zera.
Źródło:ISO / IEC 14882: 2003 (E)
(Nie mogłem znaleźć darmowej wersjiISO/IEC 1539:1991
. Czy ktoś wie, skąd go wziąć?)
Operacja wydaje się być zdefiniowana w ten sposób:
Pytanie:
Czy to ma sens zdefiniować to w ten sposób?
Jakie są argumenty dla tej specyfikacji? Czy jest miejsce, gdzie ludzie, którzy tworzą takie standardy, omawiają to? Gdzie mogę przeczytać coś o powodach, dla których zdecydowali się zrobić to w ten sposób?
Przez większość czasu, gdy używam modulo, chcę uzyskać dostęp do elementów struktury danych. W tym przypadku muszę się upewnić, że mod zwraca nieujemną wartość. W tym przypadku dobrze byłoby, gdyby mod zawsze zwracał wartość nieujemną. (Innym zastosowaniem jestAlgorytm euklidesowy. Ponieważ możesz użyć obu liczb dodatnich przed użyciem tego algorytmu, znak modulo miałby znaczenie.)
Dodatkowy materiał:
WidziećWikipedia po długą listę tego, co modulo robi w różnych językach.