การแบ่งเกิดขึ้นในคอมพิวเตอร์ของเราอย่างไร


17

การแบ่งเกิดขึ้นในคอมพิวเตอร์ดิจิทัลอย่างไร อัลกอริทึมสำหรับมันคืออะไร?

ฉันค้นหาอย่างหนักใน google แต่ยังไม่ได้ผลลัพธ์ที่น่าพอใจ โปรดระบุอัลกอริทึม / ผังงานที่ชัดเจนมากสำหรับอัลกอริทึมการหารด้วยภาพประกอบตัวอย่าง


1
@ program-o-steve Division ใน ALU เป็นการดำเนินการที่ซับซ้อน คุณจะไม่ได้รับแผนผัง "แบบง่าย"
Majenko

5
@ Leon Heller โอ้! มันไม่ได้พูดอย่างนั้นนี่เป็นคำถามฮาร์ดแวร์อย่างแท้จริง
program-o-steve

2
@ Leon Heller ฉันคิดว่ามันไม่ใช่.... ซึ่งรวมถึงอุปกรณ์อิเล็กทรอนิกส์, การคำนวณทางกายภาพ ...
program-o-steve

2
การหารในไมโครคอนโทรลเลอร์ไม่ได้อยู่ตรงหน้า มีวิธีที่รวดเร็วและช้าในการทำมัน วิธีที่ช้านั้นง่ายต่อการเข้าใจ แต่วิธีที่รวดเร็วใช้ในซีพียูสมัยใหม่คุณต้องการรู้อะไรเป็นพิเศษ? คุณเพียงแค่ต้องการความเข้าใจพื้นฐานของหลักการหรือการวิเคราะห์รายละเอียดของ CPU ที่ทันสมัย
Konsalik

4
@ LeonHeller ฉันมักจะเห็นด้วยกับคำถามที่คุณต้องการปิด แต่การออกแบบ CPU เป็นคำถามวิศวกรรมไฟฟ้ามาก คำถามนี้สามารถใช้ความช่วยเหลือบางอย่างเพื่อทำให้ชัดเจนยิ่งขึ้นในสิ่งที่ต้องการ (เช่นสิ่งที่ konsalik ถาม) แต่นั่นก็ไม่ได้ทำให้มันนอกหัวข้อ
Kellenjb

คำตอบ:


17

อัลกอริธึมการแบ่งในการออกแบบดิจิทัลสามารถแบ่งออกเป็นสองประเภทหลัก การแบ่งช้าและการแบ่งเร็ว

ฉันขอแนะนำให้คุณอ่านวิธีเพิ่มและการลบแบบไบนารีหากคุณยังไม่คุ้นเคยกับแนวคิดเหล่านี้

กองช้า

วิธีการที่ช้าที่สุดที่ง่ายที่สุดทั้งหมดทำงานด้วยวิธีดังต่อไปนี้: ลบตัวส่วนจากตัวเศษ ทำสิ่งนี้ซ้ำกับผลลัพธ์ของการลบแต่ละครั้งจนกว่าส่วนที่เหลือจะน้อยกว่าตัวหาร จำนวนการทำซ้ำคือความฉลาดหารจำนวนเต็มและจำนวนที่เหลืออยู่คือส่วนที่เหลือ

ตัวอย่าง:

7/3:

  1. 73=4
  2. 43=1
  3. 1<3

ดังนั้นคำตอบคือ 2 กับส่วนที่เหลือ 1 เพื่อให้คำตอบนี้มีความเกี่ยวข้องมากขึ้นนี่คือพื้นหลัง การลบแบบไบนารีด้วยการเพิ่มค่าลบจะดำเนินการเช่น: 7 - 3 = 7 + (-3) สามารถทำได้โดยใช้ส่วนประกอบสองอย่าง แต่ละเลขฐานสองถูกเพิ่มเข้ามาโดยใช้ชุดข้อมูลเสริมแบบเต็ม:

ป้อนคำอธิบายรูปภาพที่นี่

ที่ adder เต็ม 1 บิตแต่ละตัวจะถูกนำมาใช้ดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

กองเร็ว

ในขณะที่วิธีการแบ่งช้าลงเป็นเรื่องง่ายที่จะเข้าใจมันต้องซ้ำซ้ำ มีอัลกอริทึม "เร็ว" ที่หลากหลาย แต่พวกเขาทั้งหมดต้องอาศัยการประเมิน

พิจารณาวิธีการ Goldschmidt:

Q=ND

วิธีนี้ใช้ได้ผลดังนี้:

  1. คูณ N และ D ด้วยเศษส่วน F ในลักษณะที่ D เข้าใกล้ 1
  2. เมื่อ D เข้าใกล้ 1, N เข้าใกล้ Q

วิธีนี้ใช้การคูณแบบไบนารีผ่านการเพิ่มซ้ำซึ่งใช้ใน CPU AMD รุ่นใหม่ด้วย


1
ผังงานบางอย่างสำหรับรูปแบบวิธีการ 'ช้า' (ดำเนินการในการชุมนุมบนไมโครโดยไม่ต้องแบ่งฮาร์ดแวร์ แต่ยังคงเป็นประโยชน์) จะได้รับใน Atmel ของAVR200 appnote
Kevin Vermeer

คุณช่วยยกภาพประกอบในวิธีการแบ่ง Goldschmidt ได้ไหม นอกจากนี้ยังมีแผนภูมิการไหลให้ที่นี่เป็นตัวอย่างของการแบ่งช้าอยู่แล้ว?
โปรแกรม -o-steve

วิธีการที่เราต้องเปลี่ยนเงินปันผลไปทางซ้ายซ้ำแล้วซ้ำอีกคืออะไร?
โปรแกรม -o-steve

@ program-o-steve นี่เป็นภาพประกอบด่วน: find 22/7 (การประมาณค่า pi) ก่อนอื่นคูณด้านบนและล่างด้วย 0.1 เพื่อรับ: 2.2 / 0.7 คูณอีกครั้งโดยใช้ 1.3 ให้: 2.86 / 0.91 ใช้ 1.09 ให้: 3.1174 / 0.9919 1.008 ให้: 3.1423393 / 0.9998352 ต่อไปคุณจะไปถึง FINAL ANSWER 3.1428571 / 1.000000 ...
อลันแคมป์เบล

คุณจะ "คูณด้วยเศษส่วน" ได้อย่างไร เศษส่วนไม่สามารถแทนได้ในจุดลอย เศษส่วนตามคำนิยามคือตัวเศษหารด้วยตัวส่วนดังนั้นคุณจึงเหลืออยู่ในการโต้แย้งแบบวงกลมที่ยังคงต้องหาร และมีใครประมาณว่าเศษส่วนนั้นในตอนแรก?
CogitoErgoCogitoSum

4

ฮาร์ดแวร์สำหรับการแบ่งจำนวนทศนิยมเป็นส่วนหนึ่งของหน่วยลอจิกที่ยังทำการคูณ; มีโมดูลฮาร์ดแวร์ตัวคูณพร้อมใช้งาน ตัวเลขจุดลอยตัว, พูดว่า A และ B, จะถูกหาร (สร้าง A / B) โดย

  1. การแยกย่อยตัวเลขทศนิยมลงในเครื่องหมาย (+1 หรือ -1), แมนทิสซา ("a" และ "b" และ (ประเภทเลขจำนวนเต็มไบนารี) เลขชี้กำลัง
  2. เครื่องหมายของผลลัพธ์คือ (+1) iff สัญญาณทั้งคู่เหมือนกัน (-1)
  3. เลขชี้กำลังถูกลบออก (เลขชี้กำลังของ B ลบออกจากเลขชี้กำลังของ A) เพื่อจัดรูปแบบเลขชี้กำลังของผลลัพธ์
  4. mantissas (เลขฐานสองของตัวเลข) เป็นเลขฐานสองแบบตายตัวระหว่าง 1/2 ถึง 1; นั่นหมายความว่าตัวเลขแรกหลังจากจุดฐานสองคือ '1' ตามด้วยเลขศูนย์และเลข ... เป็นขั้นตอนแรกตารางการค้นหาจะค้นหาความถูกต้องซึ่งกันและกันถึงหกบิต (มีเพียง 32 ตัวเท่านั้นมันเป็นตารางเล็ก ๆ )

  5. a=a* * * *RอีผมพีRโอaล.()* * * *RอีผมพีRโอaล.()

  6. d==1+ε
    d* * * *(2-d)=(1+ε)×(1-ε)=1-ε2
    นี่ก็หมายความว่า 'หนึ่ง' ความถูกต้องห้าบิตของเราในตัวส่วนจะกลายเป็นความถูกต้องสิบบิตหลังจากการเพิ่มทวีคูณคู่หนึ่งคู่ยี่สิบบิตถูกต้องหลังจากที่สองและสี่สิบบิตหลังจากสาม ทำการวนซ้ำของตัวคูณและตัวหารด้วย (2 - ตัวหาร) ซ้ำตามความแม่นยำของผลลัพธ์
  7. ตัวเศษซึ่งตอนนี้ตัวส่วนคือ '1' เป็น mantissa ของผลลัพธ์และสามารถนำมารวมกับเครื่องหมายและเลขชี้กำลังที่คำนวณไว้ก่อนหน้านี้
  8. จุดลอยตัวของ IEEE อนุญาตให้มีข้อยกเว้นบางอย่าง (ตัวเลข denormalized, NAN ซึ่งต้องจัดการโดยการดำเนินการเชิงตรรกะอื่น ๆ

ที่น่าสนใจคือ Pentium ตัวเก่าที่แบ่งข้อบกพร่อง (บอกใบเรื่องข่าวมากในปี 1994) เกิดจากข้อผิดพลาดในการพิมพ์ที่ทำให้ค่าตารางซึ่งกันและกันผิดพลาดสำหรับขั้นตอน (4) เอกสารฉบับต้น "วิธีหารด้วย Parallel Multplier", Domenico Ferrari, IEEE Trans อิเล็กตรอน. คอมพิวเต EC-16 / 224-228 (1967) อธิบายวิธีการเช่นเดียวกับ "IBM System / 360 Model 91: หน่วยดำเนินการจุดลอยตัว" IBM J. Res dev 11 : 34-53 (1967)


1

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

การคำนวณผลตอบแทนของส่วนที่ไม่เลว; มันทำโดยการปรับการประมาณต่อเนื่อง ให้คุณเดาได้เลยว่า 1 / d สำหรับการคาดเดาที่ดีขึ้นให้ใช้ g '= g (2-gd) สิ่งนี้จะรวมกันเป็นสองส่วนดังนั้นคุณจึงเพิ่มความแม่นยำเป็นสองเท่าในการปรับปรุงแต่ละครั้ง

ตัวอย่าง: คำนวณส่วนกลับของ 3.5

การคาดเดาเริ่มต้นของคุณคือ 0.3 คุณคำนวณ 0.3 * 3.5 = 1.15 การเดาที่ปรับของคุณคือ 0.3 * (2 - 1.15) = 0.285 ใกล้สวยแล้ว! ทำซ้ำขั้นตอนนี้และคุณได้รับ 0.2857125 และหนึ่งในสามลองรับ 0.2857142857

มีทางลัดบางอย่าง ในจุดลอยคุณสามารถดึงพลังสิบหรือพลังของสองขึ้นอยู่กับฐานหมายเลขของเครื่องของคุณ และเพื่อความรวดเร็วในการใช้หน่วยความจำที่มากขึ้นคุณสามารถใช้ตารางที่คำนวณล่วงหน้าสำหรับตัวเลขในช่วง 1 ถึง b (โดยที่ b คือฐานหมายเลขของคุณ) เพื่อให้เดาได้ว่าใกล้เคียงกับส่วนกลับที่ต้องการและทันที บันทึกหนึ่งหรือสองขั้นตอนการปรับแต่ง

โปรดจำไว้ว่าเช่นเดียวกับการคูณและความอับอายของ Kolmogorov ในปี 1960 โดยนักเรียนของเขา Anatoly Karatsuba คุณไม่มีทางรู้ว่าเมื่อวิธีการที่เร็วกว่าหรือดีกว่าจะพบ อย่ายอมแพ้ความอยากรู้ของคุณ


-1

คอมพิวเตอร์ไม่ได้เพิ่มซ้ำ ๆ เพื่อคูณตัวเลข - มันจะช้ามาก มีขั้นตอนวิธีการคูณที่รวดเร็ว ลองดู: http://en.wikipedia.org/wiki/Karatsuba_algorithm


ยินดีต้อนรับสู่ EE.SE คำตอบสำหรับลิงก์เท่านั้นไม่ได้รับการสนับสนุน กรุณาสรุปข้อมูลในลิงค์
Null

พวกเขาทำ. ซีพียูจำนวนมากยังคงไม่มีตัวทวีคูณรอบเดียวและใช้การกลายพันธุ์ของซอฟต์แวร์
user3528438
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.