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?
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?
Jawaban:
Ada perbedaan antara modulus dan sisanya. Sebagai contoh:
-21
mod 4
ini 3
karena -21 + 4 x 6
adalah 3
.
Tetapi -21
dibagi dengan 4
memberi -5
dengan sisa -1
.
Untuk nilai positif, tidak ada perbedaan.
%
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 sisa 1
, implementasi hanya harus mendokumentasikan mana. C99 menghilangkan fleksibilitas, jadi sekarang -5 / 2
selalu -2
.
-21
mod 4
adalah 3
? Kenapa perhitungannya -21 + 4 x 6
?
-21 + 4 x 6
berada di antara 0 dan 3.
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 6Operan dari
%
operator harus memiliki tipe integer. C11dr §6.5.5 2Hasil 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%b
operasi C ketika a
negatif.
// 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 sisax/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.
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 / 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 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.
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
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
dan a modulo b
memiliki arti yang sama ketika a,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.