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.
@ 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.
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
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.
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.
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
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.
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.
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.
Jawaban:
Ada perbedaan antara modulus dan sisanya. Sebagai contoh:
-21
mod4
ini3
karena-21 + 4 x 6
adalah3
.Tetapi
-21
dibagi dengan4
memberi-5
dengan sisa-1
.Untuk nilai positif, tidak ada perbedaan.
sumber
%
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 / 2
bisa-2
dengan sisa-1
, atau-3
dengan sisa1
, implementasi hanya harus mendokumentasikan mana. C99 menghilangkan fleksibilitas, jadi sekarang-5 / 2
selalu-2
.-21
mod4
adalah3
? Kenapa perhitungannya-21 + 4 x 6
?-21 + 4 x 6
berada di antara 0 dan 3.Dalam C,
%
adalah sisa 1 .C tidak mendefinisikan "mod", seperti fungsi modulus integer yang digunakan dalam divisi Euclidean atau modulo lainnya . "Euclidean mod" berbeda dari
a%b
operasi C ketikaa
negatif.Modulo sebagai divisi Euclidean
Kode modulo kandidat:
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: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 atasmodulo_Euclidean()
akan bekerja dengan sisa sekolah tua alternatif ini juga.sumber
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:
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.
sumber
Dalam C dan C ++ dan banyak bahasa,
%
sisanya BUKAN operator modulus.Misalnya dalam operasi
-21 / 4
bagian bilangan bulat adalah-5
dan bagian desimal adalah-.25
. Sisanya adalah bagian fraksional kali pembagi, jadi sisanya adalah-1
. JavaScript menggunakan sisa operator dan mengonfirmasi hal iniOperator 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.
sumber
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.
sumber
0 ≤ r < |b|
yang berarti sisa alias "operasi modulo." selalu paling tidak 0. Definisi apa yang Anda gunakan yang menghasilkan -2 dan -1?a%b
dana modulo b
memiliki arti yang sama ketikaa,b
positif. 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.