การแบ่งเกิดขึ้นในคอมพิวเตอร์ดิจิทัลอย่างไร อัลกอริทึมสำหรับมันคืออะไร?
ฉันค้นหาอย่างหนักใน google แต่ยังไม่ได้ผลลัพธ์ที่น่าพอใจ โปรดระบุอัลกอริทึม / ผังงานที่ชัดเจนมากสำหรับอัลกอริทึมการหารด้วยภาพประกอบตัวอย่าง
การแบ่งเกิดขึ้นในคอมพิวเตอร์ดิจิทัลอย่างไร อัลกอริทึมสำหรับมันคืออะไร?
ฉันค้นหาอย่างหนักใน google แต่ยังไม่ได้ผลลัพธ์ที่น่าพอใจ โปรดระบุอัลกอริทึม / ผังงานที่ชัดเจนมากสำหรับอัลกอริทึมการหารด้วยภาพประกอบตัวอย่าง
คำตอบ:
อัลกอริธึมการแบ่งในการออกแบบดิจิทัลสามารถแบ่งออกเป็นสองประเภทหลัก การแบ่งช้าและการแบ่งเร็ว
ฉันขอแนะนำให้คุณอ่านวิธีเพิ่มและการลบแบบไบนารีหากคุณยังไม่คุ้นเคยกับแนวคิดเหล่านี้
กองช้า
วิธีการที่ช้าที่สุดที่ง่ายที่สุดทั้งหมดทำงานด้วยวิธีดังต่อไปนี้: ลบตัวส่วนจากตัวเศษ ทำสิ่งนี้ซ้ำกับผลลัพธ์ของการลบแต่ละครั้งจนกว่าส่วนที่เหลือจะน้อยกว่าตัวหาร จำนวนการทำซ้ำคือความฉลาดหารจำนวนเต็มและจำนวนที่เหลืออยู่คือส่วนที่เหลือ
ตัวอย่าง:
7/3:
ดังนั้นคำตอบคือ 2 กับส่วนที่เหลือ 1 เพื่อให้คำตอบนี้มีความเกี่ยวข้องมากขึ้นนี่คือพื้นหลัง การลบแบบไบนารีด้วยการเพิ่มค่าลบจะดำเนินการเช่น: 7 - 3 = 7 + (-3) สามารถทำได้โดยใช้ส่วนประกอบสองอย่าง แต่ละเลขฐานสองถูกเพิ่มเข้ามาโดยใช้ชุดข้อมูลเสริมแบบเต็ม:
ที่ adder เต็ม 1 บิตแต่ละตัวจะถูกนำมาใช้ดังนี้:
กองเร็ว
ในขณะที่วิธีการแบ่งช้าลงเป็นเรื่องง่ายที่จะเข้าใจมันต้องซ้ำซ้ำ มีอัลกอริทึม "เร็ว" ที่หลากหลาย แต่พวกเขาทั้งหมดต้องอาศัยการประเมิน
พิจารณาวิธีการ Goldschmidt:
วิธีนี้ใช้ได้ผลดังนี้:
วิธีนี้ใช้การคูณแบบไบนารีผ่านการเพิ่มซ้ำซึ่งใช้ใน CPU AMD รุ่นใหม่ด้วย
ฮาร์ดแวร์สำหรับการแบ่งจำนวนทศนิยมเป็นส่วนหนึ่งของหน่วยลอจิกที่ยังทำการคูณ; มีโมดูลฮาร์ดแวร์ตัวคูณพร้อมใช้งาน ตัวเลขจุดลอยตัว, พูดว่า A และ B, จะถูกหาร (สร้าง A / B) โดย
mantissas (เลขฐานสองของตัวเลข) เป็นเลขฐานสองแบบตายตัวระหว่าง 1/2 ถึง 1; นั่นหมายความว่าตัวเลขแรกหลังจากจุดฐานสองคือ '1' ตามด้วยเลขศูนย์และเลข ... เป็นขั้นตอนแรกตารางการค้นหาจะค้นหาความถูกต้องซึ่งกันและกันถึงหกบิต (มีเพียง 32 ตัวเท่านั้นมันเป็นตารางเล็ก ๆ )
ที่น่าสนใจคือ 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 / 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 คุณไม่มีทางรู้ว่าเมื่อวิธีการที่เร็วกว่าหรือดีกว่าจะพบ อย่ายอมแพ้ความอยากรู้ของคุณ
คอมพิวเตอร์ไม่ได้เพิ่มซ้ำ ๆ เพื่อคูณตัวเลข - มันจะช้ามาก มีขั้นตอนวิธีการคูณที่รวดเร็ว ลองดู: http://en.wikipedia.org/wiki/Karatsuba_algorithm