Mój przyjaciel powiedział, że istnieją różnice między „mod” a „reszta”.
Jeśli tak, jakie są te różnice w C i C ++? Czy „%” oznacza „mod” lub „rem” w C?
Mój przyjaciel powiedział, że istnieją różnice między „mod” a „reszta”.
Jeśli tak, jakie są te różnice w C i C ++? Czy „%” oznacza „mod” lub „rem” w C?
Odpowiedzi:
Istnieje różnica między modułem a resztą. Na przykład:
-21
mod 4
jest, 3
ponieważ -21 + 4 x 6
jest 3
.
Ale -21
podzielone przez 4
daje -5
z resztą -1
.
W przypadku wartości dodatnich nie ma różnicy.
%
było to zawsze reszta, ale może to być również moduł (tj. Zawsze dodatni), ponieważ w C89 dzielenie liczb całkowitych było dozwolone zaokrąglać w kierunku ujemnej nieskończoności zamiast w kierunku 0. Tak więc w C89, -5 / 2
może być -2
z resztą -1
lub -3
z resztą 1
, implementacja musiała tylko udokumentować, które. C99 usunął elastyczność, więc teraz -5 / 2
jest zawsze -2
.
-21
mod ? Dlaczego obliczenia są ? 4
3
-21 + 4 x 6
-21 + 4 x 6
jest między 0 a 3.
Czy „%” oznacza „mod” lub „rem” w C?
W C %
jest reszta 1 .
..., wynikiem
/
operatora jest iloraz algebraiczny z odrzuconą dowolną częścią ułamkową ... (Jest to często nazywane „obcięciem w kierunku zera”). C11dr §6.5.5 6Operandy
%
operatora są typu całkowitego. C11dr §6.5.5 2Wynikiem
/
operatora jest iloraz z dzielenia pierwszego argumentu przez drugi; wynikiem%
operatora jest reszta ... C11dr §6.5.5 5
Jaka jest różnica między „mod” a „reszta”?
C nie definiuje „mod”, na przykład funkcji modułu całkowitego używanej w dzieleniu euklidesowym lub w innych modulo . „Mod euklidesowy” różni się od a%b
operacji C, gdy a
jest ujemny.
// a % b
7 % 3 --> 1
7 % -3 --> 1
-7 % 3 --> -1
-7 % -3 --> -1
Modulo jako podział euklidesowy
7 modulo 3 --> 1
7 modulo -3 --> 1
-7 modulo 3 --> 2
-7 modulo -3 --> 2
Kandydat na kod modulo:
int modulo_Euclidean(int a, int b) {
int m = a % b;
if (m < 0) {
// m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
m = (b < 0) ? m - b : m + b;
}
return m;
}
Uwaga na temat zmiennoprzecinkowych: double fmod(double x, double y)
chociaż nazywa się to „fmod”, nie jest to to samo, co dzielenie euklidesowe „mod”, ale jest podobne do reszty liczby całkowitej C:
Te
fmod
funkcje obliczenia zmiennoprzecinkowe resztęx/y
. C11dr §7.12.10.1 2
fmod( 7, 3) --> 1.0
fmod( 7, -3) --> 1.0
fmod(-7, 3) --> -1.0
fmod(-7, -3) --> -1.0
Ujednoznacznienie : C ma również podobną nazwaną funkcję, double modf(double value, double *iptr)
która dzieli wartość argumentu na części całkowite i ułamkowe, z których każda ma ten sam typ i znak jak argument. To ma niewiele wspólnego z dyskusją o "modach" poza podobieństwem nazw.
1 Przed C99, definicja C %
nadal była pozostałością z dzielenia, ale wtedy /
pozwalała ujemnym ilorazom na zaokrąglenie w dół zamiast „obcięcia w kierunku zera”. Zobacz Dlaczego otrzymujesz różne wartości dzielenia liczb całkowitych w C89? . Tak więc w przypadku niektórych kompilacji sprzed C99 %
kod może działać tak, jak „mod” działu euklidesowego. Powyższe modulo_Euclidean()
będzie działać również z tą alternatywną pozostałością ze starej szkoły.
W C i C ++ oraz wielu językach, %
reszta NIE jest operatorem modułu.
Na przykład w operacji -21 / 4
część całkowita to, -5
a część dziesiętna to -.25
. Reszta to część ułamkowa pomnożona przez dzielnik, więc nasza reszta to -1
. JavaScript używa operatora reszty i potwierdza to
console.log(-21 % 4 == -1);
Operator modułu działa tak, jakbyś miał „zegar”. Wyobraź sobie okrąg z wartościami 0, 1, 2 i 3 odpowiednio na godzinie 12, 3, 6 i 9. Podnoszenie ilorazu razy w kierunku zgodnym z ruchem wskazówek zegara daje nam wynik działania modułu lub, w naszym przykładzie, z ilorazem ujemnym, przeciwnie do ruchu wskazówek zegara, dając 3.
Uwaga: moduł jest zawsze tym samym znakiem co dzielnik, a pozostała część jest tym samym znakiem co iloraz. Dodanie dzielnika i reszty, gdy przynajmniej jeden jest ujemny, daje moduł.
7 / -3 = -2
, ale 7 rem -3 = 1
.
Moduł, w arytmetyce modularnej, o którym mówisz, jest wartością pozostałą lub pozostałą wartością po dzieleniu arytmetycznym. Jest to powszechnie znane jako reszta. % jest formalnie operatorem reszty w C / C ++. Przykład:
7 % 3 = 1 // dividend % divisor = remainder
Pozostaje do dyskusji, jak traktować negatywne dane wejściowe w tej operacji%. Nowoczesne C i C ++ tworzą dla tej operacji znak reszty ze znakiem, w którym znak wyniku zawsze pasuje do wejściowej dywidendy bez względu na znak wejściowy dzielnika.
W matematyce wynik operacji modulo jest pozostałą częścią podziału euklidesowego. Jednak możliwe są inne konwencje. Komputery i kalkulatory mają różne sposoby przechowywania i przedstawiania liczb; w związku z tym ich definicja operacji modulo zależy od języka programowania i / lub używanego sprzętu.
7 modulo 3 --> 1
7 modulo -3 --> -2
-7 modulo 3 --> 2
-7 modulo -3 --> -1
0 ≤ r < |b|
że reszta jest znana jako „operacja modulo”. wynosi zawsze co najmniej 0. Jakiej definicji używasz, która daje -2 i -1?
a%b
i a modulo b
mają to samo znaczenie, gdy a,b
są pozytywne. C99 definiuje %
precyzyjnie za pomocą wartości ujemnych. C nazywa to „resztą”. „Modulo” ma różne definicje na świecie dotyczące wartości ujemnych. C spec używa tylko „modulo” w kontekście liczb dodatnich.