"Mod" ve "kalan" arasındaki fark nedir?


133

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?


2
Negatif operandlar için muhtemelen yanlış tanımlanmıştır.
Basile Starynkevitch

1
Ben bir C kişisi değilim :( bu yüzden cevap kutusunun içinde buna gerçekten cevap veremem. Ama lütfen bu makaleye bir göz at :)
bonCodigo

1
% kalan. Cevap ayrıntıları burada -> blogs.msdn.com/b/ericlippert/archive/2011/12/05/…
wim

1
Terimlerin ne anlama geldiğini kesin olarak tanımlayana kadar soru hiçbir şey ifade etmiyor.
David Heffernan

14
@David: Soru terimlerin anlamları ile ilgili. Birkaç kişinin soruyu soran kişinin amaçladığı şekilde anlamasına rağmen sorunun bir anlamı olmadığını söylerseniz, o zaman "demek" kelimesiyle ne demek istediğinizi daha spesifik olmanız gerektiğini düşünüyorum ;-)
Steve Jessop

Yanıtlar:


140

Modül ve kalan arasında bir fark vardır. Örneğin:

-21mod 4olduğu 3için -21 + 4 x 6olduğunu 3.

Ama -21bölü 4verir -5bir kalanı -1.

Pozitif değerler için fark yoktur.


22
% C
cinsinden

22
@Jinxiao: C89'da uygulama tanımlıydı: %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 / 2olabilir veya geri kalanıyla olabilir , uygulama hangisini belgelemek zorundaydı. C99 esnekliği kaldırdı, şimdi de öyle . -2-1-31-5 / 2-2
Steve Jessop

2
Aslında modülün ne olduğu belli değil. Bağlama ve dile bağlı olarak birçok farklı tanım var gibi görünüyor. Modulo_operation hakkındaki wikipedia makalesine bakın. Bazı bağlamlarda, aslında kalanla aynıdır.
Rudy Velthuis

9
Birisi ilk hesaplamadaki adımları açıklayabilir mi? Nasıl -21mod 4olduğunu 3? Hesaplama neden -21 + 4 x 6?
Oz Edri

13
@OzEdri Mod 4'ün bir sayısını elde etmek için, 0 ile 3 arasında bir sayı elde etmek için 4'ün tam sayı katını eklersiniz. -21 için bu tam sayı 6, çünkü -21 + 4 x 60 ile 3 arasındadır.
David Schwartz

47

'%', 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%bolduğ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 hesaplamak 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   

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.


1
C'deki Öklid bölünmesini ve modulo işlevlerini uygulamak için, Bilgisayar Bilimcileri için Bölme ve Modül'e bakın . Yalnızca temettüünüzün negatif olabileceğini bilirseniz daha hızlı çalışabilir, ancak böleniniz her zaman pozitiftir: godbolt.org/g/63UqJo . İlgili: negatif olmayan modulo soran bir x86 asm sorusu
Peter Cordes

Modulo operatörünün genel tanımı daha çok
şöyledir

2

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 .


1

C ve C ++ ve birçok dilde, %geri kalan kısım modül operatörü DEĞİLDİR.

Örneğin işlemde -21 / 4tamsayı kısmı -5ve 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.


-2

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 

2
Wiki Öklid bölme belirtmektedir 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?
chux - Monica'yı eski durumuna getir

efendim, hayır, ben sadece google 7 modulo -3 -> -2. ve.-7 modulo -3 -> -1 lütfen bunun neden olduğunu açıklayın
shub sharma

1
Google, Wiki Euclidean bölümünden (Raymond T. Boute tarafından açıklandığı gibi) farklı bir modulo tanımı (imzalı modulo?) Kullanır. Bu , farklılıkları daha fazla tartışır. Hikayenin ahlaki: a%bve olumlu a modulo bolduğ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.
chux - Monica'yı yeniden etkinleştir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.