Math:Dlaczego liczby wyjściowe C++ są ujemne przy użyciu modulo?
Jeśli masz równanie takiego:
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 wiem, że operacja modulo jest zdefiniowana dla matematyki, ale pierścień czynnikowy z pewnością jest.
Python:
W Pythonie, zawsze uzyskać wartości nieujemne podczas korzystania %
z pozytywnym m
:
#!/usr/bin/python
# -*- coding: utf-8 -*-
m = 7
for i in xrange(-8, 10 + 1):
print(i % 7)
Wyniki w:
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;
}
wyświetli:
-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 multiplikatywne operatorzy:
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).
i
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.
Źródło: ISO/IEC 14882:2003(E)
(Nie mogłem znaleźć bezpłatnej wersji ISO/IEC 1539:1991
. Czy ktoś wie gdzie można dostać od)
Operacja wydaje się być zdefiniowane następująco:
Pytanie:
czy to ma sens, aby określić ją w taki sposób?
Co to są argumenty dla tej specyfikacji? Czy istnieje miejsce, w którym dyskutują o tym ludzie, którzy tworzą takie standardy? Gdzie mogę przeczytać o przyczynach, dla których zdecydowali się to zrobić w ten sposób?
W większości przypadków, gdy używam modulo, chcę uzyskać dostęp do elementów struktury danych. W tym przypadku muszę się upewnić, że mod zwraca wartość nieujemną. Tak więc, w tym przypadku byłoby dobrze, aby mod zawsze zwracał wartość nieujemną. (Innym zastosowaniem jest Euclidean algorithm. Ponieważ przed użyciem tego algorytmu można uzyskać obie liczby dodatnie, znaczek modulo miałby znaczenie.)
Dodatkowy materiał:
Zobacz Wikipedia do długiej listy co modulo robi w różnych językach.
Powodem, dla którego C (a zatem C++) jest to, że istniejący sprzęt wykonuje matematykę w określony sposób. Standard językowy po prostu dokumentuje to, co się dzieje (a co nie). –
Użytecznym dodatkiem do tego pytania może być "i jaka jest dobra alternatywa w kodzie C++, aby uzyskać zachowanie pokazane przez Pythona?" – hertzsprung