Apa perbedaan antara "mod" dan "sisanya"?


133

Teman saya mengatakan bahwa ada perbedaan antara "mod" dan "sisanya".

Jika demikian, apa perbedaan di antara C dan C ++? Apakah '%' berarti "mod" atau "rem" dalam C?


2
Ini mungkin tidak jelas untuk operan negatif.
Basile Starynkevitch

1
Saya bukan orang C :( jadi tidak bisa menjawab ini di dalam kotak jawaban. Tapi tolong lihat artikel ini :)
bonCodigo

1
% sisanya. Jawab detailnya di sini -> blogs.msdn.com/b/ericlippert/archive/2011/12/05/…
wim

1
Pertanyaan itu tidak ada artinya sampai Anda mendefinisikan dengan tepat apa arti istilah tersebut.
David Heffernan

14
@ David: pertanyaannya adalah tentang arti dari istilah-istilah tersebut. Jika Anda mengatakan bahwa pertanyaan itu tidak memiliki makna, meskipun beberapa orang memahaminya seperti yang dimaksudkan oleh si penanya, maka saya pikir Anda harus lebih spesifik dengan apa yang Anda maksud dengan kata "mean" ;-)
Steve Jessop

Jawaban:


140

Ada perbedaan antara modulus dan sisanya. Sebagai contoh:

-21mod 4ini 3karena -21 + 4 x 6adalah 3.

Tetapi -21dibagi dengan 4memberi -5dengan sisa -1.

Untuk nilai positif, tidak ada perbedaan.


22
% berarti rem dalam C.
banuj

22
@ Jinxiao: di C89 itu adalah implementasi-didefinisikan: %selalu sisanya, tetapi mungkin juga modulus (yaitu selalu positif), karena dalam divisi integer C89 diizinkan untuk membulatkan ke arah infinity negatif alih-alih menuju 0. Jadi di C89, -5 / 2bisa -2dengan sisa -1, atau -3dengan sisa 1, implementasi hanya harus mendokumentasikan mana. C99 menghilangkan fleksibilitas, jadi sekarang -5 / 2selalu -2.
Steve Jessop

2
Sebenarnya, tidak jelas apa modulus itu. Tampaknya ada banyak definisi berbeda, tergantung pada konteks dan bahasanya. Lihat artikel wikipedia tentang modulo_operation. Dalam beberapa konteks, sebenarnya sama dengan sisanya.
Rudy Velthuis

9
Bisakah seseorang menjelaskan langkah-langkah dalam perhitungan pertama? Bagaimana -21mod 4adalah 3? Kenapa perhitungannya -21 + 4 x 6?
Oz Edri

13
@OzEdri Untuk mendapatkan beberapa nomor mod 4, Anda menambahkan bilangan bulat berapa pun dari 4 yang diperlukan untuk mendapatkan bilangan antara 0 dan 3. Untuk -21, bilangan bulat itu 6 karena -21 + 4 x 6berada di antara 0 dan 3.
David Schwartz

47

Apakah '%' berarti "mod" atau "rem" dalam C?

Dalam C, %adalah sisa 1 .

..., hasil dari / operator adalah hasil bagi aljabar dengan setiap bagian pecahan dibuang ... (Ini sering disebut "pemotongan menuju nol".) C11dr §6.5.5 6

Operan dari % operator harus memiliki tipe integer. C11dr §6.5.5 2

Hasil dari /operator adalah hasil bagi dari pembagian operan pertama oleh yang kedua; hasil dari %operator adalah sisanya ... C11dr §6.5.5 5


Apa perbedaan antara "mod" dan "sisanya"?

C tidak mendefinisikan "mod", seperti fungsi modulus integer yang digunakan dalam divisi Euclidean atau modulo lainnya . "Euclidean mod" berbeda dari a%boperasi C ketika anegatif.

 // a % b
 7 %  3 -->  1  
 7 % -3 -->  1  
-7 %  3 --> -1  
-7 % -3 --> -1   

Modulo sebagai divisi Euclidean

 7 modulo  3 -->  1  
 7 modulo -3 -->  1  
-7 modulo  3 -->  2  
-7 modulo -3 -->  2   

Kode modulo kandidat:

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;
}

Catatan tentang floating point double fmod(double x, double y):, meskipun disebut "fmod", itu tidak sama dengan Euclidean division "mod", tetapi mirip dengan sisa integer C:

The fmod fungsi menghitung floating-point sisa 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   

Disambiguasi : C juga memiliki fungsi bernama yang sama double modf(double value, double *iptr)yang memecah nilai argumen menjadi bagian integral dan fraksional, yang masing-masing memiliki tipe dan tanda yang sama dengan argumen. Ini tidak ada hubungannya dengan diskusi "mod" di sini kecuali kesamaan nama.


1 Sebelum C99, definisi C %masih merupakan sisa dari divisi, namun kemudian /memungkinkan negosiasi negatif untuk dibulatkan daripada "pemotongan ke nol". Lihat Mengapa Anda mendapatkan nilai yang berbeda untuk divisi integer di C89? . Jadi dengan beberapa kompilasi pra-C99, %kode dapat bertindak seperti "mod" divisi Euclidean. Di atas modulo_Euclidean()akan bekerja dengan sisa sekolah tua alternatif ini juga.


1
Untuk menerapkan fungsi pembagian dan modulo Euclidean di C, lihat Divisi dan Modulus untuk Ilmuwan Komputer . Ini dapat berjalan lebih cepat jika Anda tahu hanya dividen Anda yang bisa negatif, tetapi pembagi Anda selalu positif: godbolt.org/g/63UqJo . Terkait: pertanyaan as86 x86 yang meminta modulo non-negatif
Peter Cordes

Definisi biasa dari operator modulo lebih seperti:
Mike Housky

2

Modulus, dalam aritmatika modular seperti yang Anda maksudkan, adalah nilai yang tersisa atau nilai yang tersisa setelah pembagian aritmatika. Ini umumnya dikenal sebagai sisa. % secara resmi operator sisanya di C / C ++. Contoh:

7 % 3 = 1  // dividend % divisor = remainder

Yang tersisa untuk diskusi adalah bagaimana memperlakukan input negatif untuk operasi% ini. Modern C dan C ++ menghasilkan nilai sisa yang ditandatangani untuk operasi ini di mana tanda hasil selalu cocok dengan input dividen tanpa memperhatikan tanda input pembagi.


1

Dalam C dan C ++ dan banyak bahasa, %sisanya BUKAN operator modulus.

Misalnya dalam operasi -21 / 4bagian bilangan bulat adalah -5dan bagian desimal adalah -.25. Sisanya adalah bagian fraksional kali pembagi, jadi sisanya adalah -1. JavaScript menggunakan sisa operator dan mengonfirmasi hal ini

console.log(-21 % 4 == -1);

Operator modulus seperti Anda memiliki "jam". Bayangkan sebuah lingkaran dengan nilai 0, 1, 2, dan 3 masing-masing pada posisi jam 12, jam 3, jam 6, dan jam 9. Melangkah hasil bagi sekitar jam-jam bijaksana mendarat kami pada hasil operasi modulus kami, atau, dalam contoh kami dengan hasil bagi negatif, berlawanan arah jarum jam, menghasilkan 3.

Catatan: Modulus selalu merupakan tanda yang sama dengan pembagi dan sisa tanda yang sama dengan hasil bagi. Menambahkan pembagi dan sisanya ketika sisanya setidaknya satu adalah negatif menghasilkan modulus.


-2

Dalam matematika hasil operasi modulo adalah sisa dari divisi Euclidean. Namun, konvensi lain dimungkinkan. Komputer dan kalkulator memiliki berbagai cara untuk menyimpan dan mewakili angka; sehingga definisi mereka tentang operasi modulo tergantung pada bahasa pemrograman dan / atau perangkat keras yang mendasarinya.

 7 modulo  3 -->  1  
 7 modulo -3 --> -2 
-7 modulo  3 -->  2  
-7 modulo -3 --> -1 

2
The Divisi wiki Euclidean menegaskan 0 ≤ r < |b|yang berarti sisa alias "operasi modulo." selalu paling tidak 0. Definisi apa yang Anda gunakan yang menghasilkan -2 dan -1?
chux

Pak, saya tidak tidak tetapi saya hanya google 7 modulo -3 -> -2 .and.-7 modulo -3 -> -1 tolong jelaskan pak mengapa ini terjadi
shub sharma

1
Google menggunakan definisi modulo yang berbeda (modulo yang ditandatangani?) Dari divisi Wiki Euclidean (seperti dijelaskan oleh Raymond T. Boute). Ini lebih membahas perbedaan. Moral cerita: a%bdan a modulo bmemiliki arti yang sama ketika a,bpositif. C99 mendefinisikan %dengan tepat dengan nilai negatif. C menyebut ini "sisa '." Modulo "memiliki berbagai definisi di dunia mengenai nilai-nilai negatif. C spec hanya menggunakan" modulo "dalam konteks angka positif.
chux - Reinstate Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.