อะไรคือความแตกต่างระหว่าง "mod" และ "ส่วนที่เหลือ"


133

เพื่อนของฉันบอกว่ามีความแตกต่างระหว่าง "mod" และ "ส่วนที่เหลือ"

ถ้าเป็นเช่นนั้นความแตกต่างของ C และ C ++ คืออะไร? '%' หมายถึง "mod" หรือ "rem" ใน C หรือไม่


2
อาจมีการกำหนดไว้ไม่ถูกต้องสำหรับตัวถูกดำเนินการเชิงลบ
Basile Starynkevitch

1
ฉันไม่ใช่คน C :( ดังนั้นจึงไม่สามารถตอบสิ่งนี้ในช่องคำตอบได้ แต่โปรดอ่านบทความนี้ :)
bonCodigo

1
% เป็นส่วนที่เหลือ ตอบรายละเอียดที่นี่ -> blogs.msdn.com/b/ericlippert/archive/2011/12/05/…
wim

1
คำถามไม่มีความหมายจนกว่าคุณจะกำหนดความหมายของคำศัพท์ได้อย่างแม่นยำ
David Heffernan

14
@ เดวิด: คำถามเกี่ยวกับความหมายของคำศัพท์ ถ้าคุณบอกว่าคำถามไม่มีความหมายถึงแม้จะมีหลายคนเข้าใจในแบบที่ผู้ถามตั้งใจไว้ฉันคิดว่าคุณต้องเจาะจงมากขึ้นว่าคุณหมายถึงอะไรด้วยคำว่า "mean" ;-)
Steve Jessop

คำตอบ:


140

มีความแตกต่างระหว่างโมดูลัสและเศษเหลือ ตัวอย่างเช่น:

-21mod 4เป็น3เพราะ-21 + 4 x 6is 3.

แต่-21โดยแบ่ง4ให้กับส่วนที่เหลือของ-5-1

สำหรับค่าบวกจะไม่มีความแตกต่าง


22
% หมายถึง rem ใน C.
banuj

22
@Jinxiao: ใน C89 มันเป็นการดำเนินงานที่กำหนดไว้: %ก็มักจะเหลือ แต่มันอาจจะยังเป็นโมดูลัส (เช่นบวกเสมอ) เพราะใน C89 จำนวนเต็มส่วนได้รับอนุญาตให้รอบต่ออินฟินิตี้เชิงลบแทนการต่อ 0. ดังนั้นใน C89, -5 / 2อาจเป็น-2ส่วนที่เหลือ-1หรือ-3ส่วนที่เหลือ1การใช้งานก็ต้องทำเอกสาร C99 ลบออกความยืดหยุ่นดังนั้นตอนนี้อยู่เสมอ-5 / 2 -2
Steve Jessop

2
จริงๆแล้วยังไม่ทราบแน่ชัดว่าโมดูลัสคืออะไร ดูเหมือนจะมีคำจำกัดความที่แตกต่างกันมากมายขึ้นอยู่กับบริบทและภาษา ดูบทความวิกิพีเดียเกี่ยวกับ modulo_operation ในบางบริบทมันก็เหมือนกับเศษเหลือ
Rudy Velthuis

9
ใครช่วยอธิบายขั้นตอนในการคำนวณครั้งแรกได้ไหม? วิธี-21mod 4คือ3? ทำไมการคำนวณคือ-21 + 4 x 6?
Oz Edri

13
@OzEdri หากต้องการรับหมายเลข mod 4 คุณต้องเพิ่มจำนวนเต็มจำนวนเต็มของ 4 เพื่อให้ได้ตัวเลขระหว่าง 0 ถึง 3 สำหรับ -21 จำนวนเต็มนั้นคือ 6 เนื่องจาก-21 + 4 x 6อยู่ระหว่าง 0 ถึง 3
David Schwartz

47

'%' หมายถึง "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/yC11dr §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()จะใช้ได้กับส่วนที่เหลือของโรงเรียนเก่าทางเลือกนี้ด้วย


1
ในการดำเนินการแบบยุคลิดส่วนและฟังก์ชั่นแบบโมดูโลใน C ดูกองและโมดูลัสสำหรับนักวิทยาศาสตร์คอมพิวเตอร์ มันสามารถทำงานได้เร็วขึ้นถ้าคุณรู้ว่าเพียงเงินปันผลของคุณสามารถเป็นลบ แต่ตัวหารของคุณอยู่เสมอในเชิงบวก: godbolt.org/g/63UqJo ที่เกี่ยวข้อง: คำถาม x86 asm ที่ถามหาโมดูโลที่ไม่ใช่ค่าลบ
Peter Cordes

คำจำกัดความตามปกติของตัวดำเนินการโมดูโลเป็นเหมือน:
Mike Housky

2

โมดูลัสในการคำนวณทางคณิตศาสตร์แบบแยกส่วนตามที่คุณอ้างถึงคือค่าที่เหลือหรือค่าที่เหลืออยู่หลังจากการหารเลขคณิต โดยทั่วไปเรียกว่าเศษเหลือ % เป็นตัวดำเนินการส่วนที่เหลืออย่างเป็นทางการใน C / C ++ ตัวอย่าง:

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

สิ่งที่เหลือสำหรับการสนทนาคือวิธีการจัดการอินพุตเชิงลบของการดำเนินการ% นี้ Modern C และ C ++ สร้างค่าที่เหลือที่ลงนามสำหรับการดำเนินการนี้โดยที่เครื่องหมายของผลลัพธ์จะตรงกับอินพุตเงินปันผลเสมอโดยไม่คำนึงถึงเครื่องหมายของอินพุตตัวหาร


1

ในภาษา C และ C ++ และหลายภาษา %ส่วนที่เหลือไม่ใช่ตัวดำเนินการโมดูลัสหรือไม่

ยกตัวอย่างเช่นในการดำเนินงาน-21 / 4ส่วนจำนวนเต็มคือและเป็นส่วนหนึ่งทศนิยมคือ-5 ส่วนที่เหลือเป็นเศษครั้งส่วนหารดังนั้นที่เหลือของเราคือ-.25 -1JavaScript ใช้ตัวดำเนินการที่เหลือและยืนยันสิ่งนี้

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

ตัวดำเนินการโมดูลัสก็เหมือนกับคุณมี "นาฬิกา" ลองนึกภาพวงกลมที่มีค่า 0, 1, 2 และ 3 ที่ตำแหน่ง 12 นาฬิกา 3 นาฬิกา 6 นาฬิกาและ 9 นาฬิกาตามลำดับ การคูณผลหารรอบเวลาตามเข็มนาฬิกาทำให้เราได้รับผลของการดำเนินการโมดูลัสของเราหรือในตัวอย่างของเราด้วยผลหารผลคูณเชิงลบทวนเข็มนาฬิกา 3

หมายเหตุ:โมดูลัสเป็นเครื่องหมายเดียวกับตัวหารเสมอและส่วนที่เหลือจะเป็นเครื่องหมายเดียวกับผลหาร การเพิ่มตัวหารและส่วนที่เหลือเมื่อส่วนที่เหลืออย่างน้อยหนึ่งตัวเป็นลบจะให้โมดูลัส


-2

ในทางคณิตศาสตร์ผลลัพธ์ของการดำเนินการโมดูโลคือส่วนที่เหลือของการหารแบบยุคลิด อย่างไรก็ตามอนุสัญญาอื่น ๆ เป็นไปได้ คอมพิวเตอร์และเครื่องคำนวณมีหลายวิธีในการจัดเก็บและแสดงตัวเลข ดังนั้นคำจำกัดความของการทำงานของโมดูโลจึงขึ้นอยู่กับภาษาโปรแกรมและ / หรือฮาร์ดแวร์พื้นฐาน

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

2
ส่วนวิกิพีเดียยุคลิดอ้าง0 ≤ r < |b|ซึ่งหมายความว่าที่เหลืออาคา "มอดุโล." มีค่าอย่างน้อย 0 เสมอคุณใช้คำจำกัดความใดที่ให้ผลลัพธ์เป็น -2 และ -1
chux - Reinstate Monica

ครับผมไม่ได้ แต่ผมแค่ google 7 modulo -3 -> -2 .and. -7 modulo -3 -> -1 ได้โปรดอธิบายว่าทำไมสิ่งนี้ถึงเกิดขึ้น
shub sharma

1
Google ใช้คำจำกัดความของโมดูโล (โมดูโลที่ลงนาม?) ที่แตกต่างจากการแบ่งวิกิยูคลิด (ตามที่ Raymond T. Boute อธิบาย) สิ่งนี้กล่าวถึงความแตกต่างมากขึ้น คุณธรรมของเรื่องราว: a%bและa modulo bมีความหมายเดียวกันเมื่อa,bเป็นบวก C99 กำหนด%อย่างแม่นยำด้วยค่าลบ C เรียกสิ่งนี้ว่า "เศษเหลือ" "Modulo" มีคำจำกัดความที่หลากหลายในโลกที่เกี่ยวข้องกับค่าลบ C spec ใช้เฉพาะ "modulo" ในบริบทของจำนวนบวก
chux - คืนสถานะ Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.