เพื่อนของฉันบอกว่ามีความแตกต่างระหว่าง "mod" และ "ส่วนที่เหลือ"
ถ้าเป็นเช่นนั้นความแตกต่างของ C และ C ++ คืออะไร? '%' หมายถึง "mod" หรือ "rem" ใน C หรือไม่
เพื่อนของฉันบอกว่ามีความแตกต่างระหว่าง "mod" และ "ส่วนที่เหลือ"
ถ้าเป็นเช่นนั้นความแตกต่างของ C และ C ++ คืออะไร? '%' หมายถึง "mod" หรือ "rem" ใน C หรือไม่
คำตอบ:
มีความแตกต่างระหว่างโมดูลัสและเศษเหลือ ตัวอย่างเช่น:
-21
mod 4
เป็น3
เพราะ-21 + 4 x 6
is 3
.
แต่-21
โดยแบ่ง4
ให้กับส่วนที่เหลือของ-5
-1
สำหรับค่าบวกจะไม่มีความแตกต่าง
%
ก็มักจะเหลือ แต่มันอาจจะยังเป็นโมดูลัส (เช่นบวกเสมอ) เพราะใน C89 จำนวนเต็มส่วนได้รับอนุญาตให้รอบต่ออินฟินิตี้เชิงลบแทนการต่อ 0. ดังนั้นใน C89, -5 / 2
อาจเป็น-2
ส่วนที่เหลือ-1
หรือ-3
ส่วนที่เหลือ1
การใช้งานก็ต้องทำเอกสาร C99 ลบออกความยืดหยุ่นดังนั้นตอนนี้อยู่เสมอ-5 / 2
-2
-21
mod 4
คือ3
? ทำไมการคำนวณคือ-21 + 4 x 6
?
-21 + 4 x 6
อยู่ระหว่าง 0 ถึง 3
'%' หมายถึง "mod" หรือ "rem" ใน C หรือไม่
ใน C, %
เป็นเหลือ 1
... , ผลลัพธ์ของตัว
/
ดำเนินการคือผลหารพีชคณิตที่มีส่วนเศษส่วนใด ๆ ทิ้งไป ... (มักเรียกว่า "การตัดทอนไปทางศูนย์") C11dr §6.5.5 6ตัวถูกดำเนินการของตัวดำเนิน
%
การต้องมีชนิดจำนวนเต็ม C11dr §6.5.5 2ผลลัพธ์ของตัว
/
ดำเนินการคือผลหารจากการหารตัวถูกดำเนินการแรกด้วยตัวที่สอง ผลลัพธ์ของตัว%
ดำเนินการคือเศษเหลือ ... C11dr §6.5.5 5
อะไรคือความแตกต่างระหว่าง "mod" และ "ส่วนที่เหลือ"
C ไม่ได้กำหนด "สมัย" เช่นฟังก์ชั่นจำนวนเต็มโมดูลัสที่ใช้ในการแบ่งยุคลิดหรือโมดูโลอื่น ๆ "Euclidean mod" แตกต่างจากa%b
การทำงานของ C เมื่อa
เป็นค่าลบ
// a % b
7 % 3 --> 1
7 % -3 --> 1
-7 % 3 --> -1
-7 % -3 --> -1
Modulo เป็นแผนก Euclidean
7 modulo 3 --> 1
7 modulo -3 --> 1
-7 modulo 3 --> 2
-7 modulo -3 --> 2
รหัสโมดูโลผู้สมัคร:
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;
}
หมายเหตุเกี่ยวกับจุดลอยตัว: double fmod(double x, double y)
แม้ว่าจะเรียกว่า "fmod" แต่ก็ไม่เหมือนกับการหารแบบยุคลิด "mod" แต่คล้ายกับส่วนที่เหลือจำนวนเต็ม C:
ฟังก์ชั่นคำนวณที่เหลือลอยจุด
fmod
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
Disambiguation : C ยังมีฟังก์ชันที่มีชื่อคล้ายกันdouble modf(double value, double *iptr)
ซึ่งแบ่งค่าอาร์กิวเมนต์ออกเป็นส่วนอินทิกรัลและเศษส่วนซึ่งแต่ละส่วนมีประเภทและเครื่องหมายเดียวกันกับอาร์กิวเมนต์ สิ่งนี้มีส่วนเกี่ยวข้องเพียงเล็กน้อยกับการสนทนา "mod" ที่นี่ยกเว้นความคล้ายคลึงกันของชื่อ
1ก่อนหน้า C99 คำจำกัดความของ C %
ยังคงเป็นส่วนที่เหลือจากการหาร แต่จากนั้นจึง/
อนุญาตให้ผลคูณลบปัดเศษลงแทนที่จะเป็น "การตัดทอนให้เป็นศูนย์" ดูเหตุใดคุณจึงได้รับค่าที่แตกต่างกันสำหรับการหารจำนวนเต็มใน C89 . ดังนั้นด้วยการคอมไพล์ก่อน C99 บาง%
โค้ดสามารถทำหน้าที่เหมือนกับ "mod" ของการแบ่งยุคลิด ข้างต้นmodulo_Euclidean()
จะใช้ได้กับส่วนที่เหลือของโรงเรียนเก่าทางเลือกนี้ด้วย
โมดูลัสในการคำนวณทางคณิตศาสตร์แบบแยกส่วนตามที่คุณอ้างถึงคือค่าที่เหลือหรือค่าที่เหลืออยู่หลังจากการหารเลขคณิต โดยทั่วไปเรียกว่าเศษเหลือ % เป็นตัวดำเนินการส่วนที่เหลืออย่างเป็นทางการใน C / C ++ ตัวอย่าง:
7 % 3 = 1 // dividend % divisor = remainder
สิ่งที่เหลือสำหรับการสนทนาคือวิธีการจัดการอินพุตเชิงลบของการดำเนินการ% นี้ Modern C และ C ++ สร้างค่าที่เหลือที่ลงนามสำหรับการดำเนินการนี้โดยที่เครื่องหมายของผลลัพธ์จะตรงกับอินพุตเงินปันผลเสมอโดยไม่คำนึงถึงเครื่องหมายของอินพุตตัวหาร
ในภาษา C และ C ++ และหลายภาษา %
ส่วนที่เหลือไม่ใช่ตัวดำเนินการโมดูลัสหรือไม่
ยกตัวอย่างเช่นในการดำเนินงาน-21 / 4
ส่วนจำนวนเต็มคือและเป็นส่วนหนึ่งทศนิยมคือ-5
ส่วนที่เหลือเป็นเศษครั้งส่วนหารดังนั้นที่เหลือของเราคือ-.25
-1
JavaScript ใช้ตัวดำเนินการที่เหลือและยืนยันสิ่งนี้
console.log(-21 % 4 == -1);
ตัวดำเนินการโมดูลัสก็เหมือนกับคุณมี "นาฬิกา" ลองนึกภาพวงกลมที่มีค่า 0, 1, 2 และ 3 ที่ตำแหน่ง 12 นาฬิกา 3 นาฬิกา 6 นาฬิกาและ 9 นาฬิกาตามลำดับ การคูณผลหารรอบเวลาตามเข็มนาฬิกาทำให้เราได้รับผลของการดำเนินการโมดูลัสของเราหรือในตัวอย่างของเราด้วยผลหารผลคูณเชิงลบทวนเข็มนาฬิกา 3
หมายเหตุ:โมดูลัสเป็นเครื่องหมายเดียวกับตัวหารเสมอและส่วนที่เหลือจะเป็นเครื่องหมายเดียวกับผลหาร การเพิ่มตัวหารและส่วนที่เหลือเมื่อส่วนที่เหลืออย่างน้อยหนึ่งตัวเป็นลบจะให้โมดูลัส
ในทางคณิตศาสตร์ผลลัพธ์ของการดำเนินการโมดูโลคือส่วนที่เหลือของการหารแบบยุคลิด อย่างไรก็ตามอนุสัญญาอื่น ๆ เป็นไปได้ คอมพิวเตอร์และเครื่องคำนวณมีหลายวิธีในการจัดเก็บและแสดงตัวเลข ดังนั้นคำจำกัดความของการทำงานของโมดูโลจึงขึ้นอยู่กับภาษาโปรแกรมและ / หรือฮาร์ดแวร์พื้นฐาน
7 modulo 3 --> 1
7 modulo -3 --> -2
-7 modulo 3 --> 2
-7 modulo -3 --> -1
0 ≤ r < |b|
ซึ่งหมายความว่าที่เหลืออาคา "มอดุโล." มีค่าอย่างน้อย 0 เสมอคุณใช้คำจำกัดความใดที่ให้ผลลัพธ์เป็น -2 และ -1
a%b
และa modulo b
มีความหมายเดียวกันเมื่อa,b
เป็นบวก C99 กำหนด%
อย่างแม่นยำด้วยค่าลบ C เรียกสิ่งนี้ว่า "เศษเหลือ" "Modulo" มีคำจำกัดความที่หลากหลายในโลกที่เกี่ยวข้องกับค่าลบ C spec ใช้เฉพาะ "modulo" ในบริบทของจำนวนบวก