Arkadaşım "mod" ve "kalan" arasında farklılıklar olduğunu söyledi.
Öyleyse, C ve C ++ 'daki bu farklılıklar nelerdir? '%', C'de "mod" veya "rem" anlamına mı geliyor?
Arkadaşım "mod" ve "kalan" arasında farklılıklar olduğunu söyledi.
Öyleyse, C ve C ++ 'daki bu farklılıklar nelerdir? '%', C'de "mod" veya "rem" anlamına mı geliyor?
Yanıtlar:
Modül ve kalan arasında bir fark vardır. Örneğin:
-21
mod 4
olduğu 3
için -21 + 4 x 6
olduğunu 3
.
Ama -21
bölü 4
verir -5
bir kalanı -1
.
Pozitif değerler için fark yoktur.
%
her zaman geri kalan idi, ama aynı zamanda modül de olabilir (yani her zaman pozitif), çünkü C89'da tamsayı bölümünün 0 yerine negatif sonsuza yuvarlanmasına izin verildi. Yani C89'da, geri kalanla -5 / 2
olabilir veya geri kalanıyla olabilir , uygulama hangisini belgelemek zorundaydı. C99 esnekliği kaldırdı, şimdi de öyle . -2
-1
-3
1
-5 / 2
-2
-21
mod 4
olduğunu 3
? Hesaplama neden -21 + 4 x 6
?
-21 + 4 x 6
0 ile 3 arasındadır.
'%', C'de "mod" veya "rem" anlamına mı geliyor?
C, %
bir geri kalan 1 .
...,
/
operatörün sonucu, herhangi bir kesirli kısmın atıldığı cebirsel bölümdür ... (Buna genellikle "sıfıra doğru kesme" denir.) C11dr §6.5.5 6
%
Operatörün işlenenleri tam sayı tipine sahip olacaktır. C11dr §6.5.5 2
/
Operatörün sonucu , birinci işlenenin ikinciye bölünmesinden elde edilen bölümdür;%
operatörün sonucu kalan ... C11dr §6.5.5 5
"Mod" ve "kalan" arasındaki fark nedir?
C, Öklid bölünmesinde kullanılan tamsayı modülü işlevi veya diğer modulo gibi "mod" u tanımlamaz . "Öklid modu" , negatif a%b
olduğunda C'nin işleminden farklıdır a
.
// a % b
7 % 3 --> 1
7 % -3 --> 1
-7 % 3 --> -1
-7 % -3 --> -1
Öklid bölümü olarak Modulo
7 modulo 3 --> 1
7 modulo -3 --> 1
-7 modulo 3 --> 2
-7 modulo -3 --> 2
Aday modulo kodu:
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;
}
Kayan nokta hakkında not: double fmod(double x, double y)
"fmod" olarak adlandırılmasına rağmen, Öklid bölümü "mod" ile aynı değildir, ancak C tamsayı kalanına benzer:
fmod
İşlevleri kayan nokta kalan hesaplamakx/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
Netleştirme : C double modf(double value, double *iptr)
, argüman değerini, her biri argümanla aynı tip ve işarete sahip olan integral ve kesirli parçalara bölen benzer bir adlandırılmış işleve sahiptir. Bunun, isim benzerliği dışında buradaki "mod" tartışmasıyla çok az ilgisi var.
1. Ön C99, ve C 'nin tanımına %
hala kalan henüz sonra, bölünmesinden /
yerine "sıfıra doğru kesme" daha yuvarlak aşağı negatif quotients izin verdi. Bkz Neden C89 in tamsayı bölümü için farklı değerler alabilirim? . Bu nedenle, bazı C99 öncesi derlemelerde %
kod, Öklid bölümü "mod" gibi hareket edebilir. Yukarıdakiler modulo_Euclidean()
de bu alternatif eski okul kalanıyla çalışacaktır.
Modüler aritmetikte, bahsettiğiniz gibi modül, aritmetik bölünmeden sonra kalan veya kalan değerdir. Bu genellikle kalan olarak bilinir. %, resmi olarak C / C ++ 'da kalan operatördür. Misal:
7 % 3 = 1 // dividend % divisor = remainder
Tartışmaya kalan şey, bu% operasyonuna olumsuz girdilerin nasıl ele alınacağıdır. Modern C ve C ++ , sonucun işaretinin bölen girdisinin işaretine bakılmaksızın her zaman temettü girdisiyle eşleştiği bu işlem için imzalı bir kalan değer üretir .
C ve C ++ ve birçok dilde, %
geri kalan kısım modül operatörü DEĞİLDİR.
Örneğin işlemde -21 / 4
tamsayı kısmı -5
ve ondalık kısmı -.25
. Geri kalan, kesirli kısım çarpı bölen, yani kalanımızdır -1
. JavaScript kalan operatörü kullanır ve bunu doğrular
console.log(-21 % 4 == -1);
Modül operatörü sanki bir "saatiniz" varmış gibi. Sırasıyla saat 12, saat 3, saat 6 ve saat 9 konumlarında 0, 1, 2 ve 3 değerlerine sahip bir daire hayal edin. Saat yönünde kademeli bölüm zamanları bizi modül işlemimizin sonucuna götürür veya negatif bölümle yaptığımız örneğimizde saat yönünün tersine 3 verir.
Not: Modül, her zaman bölen ile aynı işarettir ve bölüm ile aynı işaret olarak kalır. En az biri negatif olduğunda bölen ve kalanı eklemek modülü verir.
Matematikte modulo işleminin sonucu Öklid bölünmesinin geri kalanıdır. Bununla birlikte, başka konvansiyonlar da mümkündür. Bilgisayarlar ve hesap makineleri, sayıları saklamak ve temsil etmek için çeşitli yöntemlere sahiptir; bu nedenle modulo işleminin tanımı programlama diline ve / veya temel donanıma bağlıdır.
7 modulo 3 --> 1
7 modulo -3 --> -2
-7 modulo 3 --> 2
-7 modulo -3 --> -1
0 ≤ r < |b|
adıyla kalan anlamına gelir "modüllük işlemde." her zaman en az 0'dır. -2 ve -1 ile sonuçlanan hangi tanımı kullanıyorsunuz?
a%b
ve olumlu a modulo b
olduğunda aynı anlama gelir a,b
. C99, %
tam olarak negatif değerlerle tanımlar . C bunu "kalan" olarak adlandırır. "Modulo" dünyada negatif değerlerle ilgili çeşitli tanımlara sahiptir. C spec yalnızca pozitif sayılar bağlamında "modulo" kullanır.