กลับไปหน้าบทความ

อ่าน 39 นาที

อัลกอริทึมรากที่สอง

อัลกอริทึมรากที่สอง คำนวณ รากที่สอง ที่ไม่เป็นลบของจำนวน จริง บวก เนื่องจากรากที่สองของจำนวนธรรมชาติ ทั้งหมด ยกเว้นกำลังสองสมบูรณ์เป็นจำนวนอตรรกยะ...

อัลกอริทึมรากที่สอง

( เรียนรู้วิธีและเวลาในการลบข้อความนี้ )

อัลกอริทึมรากที่สอง คำนวณ รากที่สอง ที่ไม่เป็นลบของจำนวน จริง บวก เนื่องจากรากที่สองของจำนวนธรรมชาติ ทั้งหมด ยกเว้นกำลังสองสมบูรณ์เป็นจำนวนอตรรกยะ[ 1 ] รากที่สองจึงมักจะคำนวณได้เพียงความแม่นยำที่จำกัดเท่านั้นอัลกอริทึม เหล่านี้โดยทั่วไป จะสร้างชุดของการประมาณค่า ที่แม่นยำขึ้นเรื่อย ๆ

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

นอกจากนี้ยังมีวิธีการอื่น ๆ ในการคำนวณรากที่สองโดยการคำนวณทีละหลักหรือใช้ชุดอนุกรมเทย์เลอร์ส่วนการประมาณค่ารากที่สองที่เป็นจำนวนตรรกยะนั้น สามารถคำนวณได้โดยใช้การกระจายเศษส่วนต่อเนื่อง

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

วิธีการบางอย่าง เช่น การหารสังเคราะห์ด้วยกระดาษและดินสอ และการกระจายอนุกรม ไม่จำเป็นต้องมีค่าเริ่มต้น ในบางกรณี อาจจำเป็นต้องใช้ รากที่สองที่เป็นจำนวนเต็มซึ่งก็คือรากที่สองที่ปัดเศษหรือตัดทิ้งให้เป็นจำนวนเต็มที่ใกล้ที่สุด (อาจใช้วิธีการที่ดัดแปลงในกรณีนี้)

ประวัติศาสตร์

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

วิธีของเฮรอนจากอียิปต์ในศตวรรษที่ 1 เป็นอัลกอริทึมแรกที่สามารถตรวจสอบได้สำหรับการคำนวณรากที่สอง[ 3 ]

วิธีการวิเคราะห์สมัยใหม่เริ่มได้รับการพัฒนาหลังจากมีการนำ ระบบ ตัวเลขอาหรับมาใช้ในยุโรปตะวันตกในช่วงต้นยุคฟื้นฟูศิลปวิทยา[ 4 ]

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

การประเมินเบื้องต้น

อัลกอริทึมการหาค่ารากที่สองแบบวนซ้ำหลายๆ วิธี จำเป็นต้องใช้ค่าเริ่มต้น (seed value ) ค่าเริ่มต้นนี้ต้องเป็นจำนวนบวกที่ไม่เป็นศูนย์ ควรอยู่ระหว่าง 1 ถึงn ซึ่งเป็นจำนวนที่ต้องการหาค่ารากที่สอง เพราะค่ารากที่สองต้องอยู่ในช่วงนั้น หากค่าเริ่มต้นอยู่ห่างจากค่ารากมาก อัลกอริทึมจะต้องการการวนซ้ำมากขึ้น หากเริ่มต้นด้วย n = 0 (หรือ n = 0 ) การวนซ้ำประมาณn = 0 จะเสียไปกับการหาค่าประมาณขนาดของราก ดังนั้นจึงเป็นประโยชน์ที่จะมีค่าประมาณคร่าวๆ ซึ่งอาจมีความแม่นยำจำกัด แต่คำนวณได้ง่าย โดยทั่วไป ยิ่งค่าประมาณเริ่มต้นดีเท่าไร การลู่เข้าก็จะยิ่งเร็วขึ้นเท่านั้น สำหรับวิธีของนิวตัน ค่าเริ่มต้นที่มากกว่าค่ารากเล็กน้อยจะลู่เข้าเร็วกว่าค่าเริ่มต้นที่น้อยกว่าค่ารากเล็กน้อย

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

การประมาณค่าแบบทศนิยม

โดยทั่วไปแล้ว ตัวเลขจะถูกแสดงในสัญกรณ์วิทยาศาสตร์เป็นโดยที่และnเป็นจำนวนเต็ม และช่วงของรากที่สองที่เป็นไปได้คือโดย ที่

การประมาณค่าสเกลาร์

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

สำหรับสองช่วงเวลาที่แบ่งตามเรขาคณิต รากที่สองสามารถประมาณได้ดังนี้[หมายเหตุ 1 ]

การประมาณค่านี้มีค่าความคลาดเคลื่อนสัมบูรณ์สูงสุดที่และค่าความคลาดเคลื่อนสัมพัทธ์สูงสุด 100% ที่

ตัวอย่าง

เมื่อแยกตัวประกอบเป็นค่าประมาณจะได้ค่าประมาณเป็น

ซึ่งมีค่าความคลาดเคลื่อนสัมบูรณ์ 246 และค่าความคลาดเคลื่อนสัมพัทธ์เกือบ 70%

การประมาณค่าเชิงเส้น

วิธีการประมาณค่าที่ดีกว่า และเป็นวิธีมาตรฐานที่ใช้กัน คือการประมาณค่าเชิงเส้นของฟังก์ชันบนส่วนโค้งเล็กๆ ถ้าหากว่า ยกกำลังของฐานออกจากจำนวนS ดังที่กล่าวมาข้างต้น และลดช่วงลงเหลือ [1, 100] อาจใช้ เส้นตัดที่ลากผ่านส่วนโค้ง หรือเส้นสัมผัสที่จุดใดจุดหนึ่งตามส่วนโค้งเป็นค่าประมาณได้ แต่เส้นถดถอยกำลังสองน้อยที่สุดที่ตัดกับส่วนโค้งจะมีความแม่นยำกว่า

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

นั่นคือค่าประมาณที่ดีที่สุดโดยเฉลี่ยที่สามารถทำได้ด้วยการประมาณเชิงเส้นแบบชิ้นเดียวของฟังก์ชันในช่วง [1, 100] โดยมีข้อผิดพลาดสัมบูรณ์สูงสุด 1.2 ที่a = 100 และข้อผิดพลาดสัมพัทธ์สูงสุด 30% ที่S = 1 และ 10 [หมายเหตุ 2 ]

ในการหารด้วย 10 ให้ลบหนึ่งออกจากเลขชี้กำลังของaหรือพูดอีกอย่างคือเลื่อนจุดทศนิยมไปทางซ้ายหนึ่งหลัก สำหรับสูตรนี้ ค่าคงที่บวก 1 บวกกับค่าเพิ่มเล็กน้อยจะทำให้ได้ค่าประมาณที่น่าพอใจ ดังนั้นการจำตัวเลขที่แน่นอนจึงไม่ใช่ภาระ การประมาณค่า (ไม่ว่าจะปัดเศษหรือไม่) โดยใช้เส้นเดียวที่ครอบคลุมช่วง [1, 100] มีความแม่นยำน้อยกว่าหนึ่งหลักสำคัญ ข้อผิดพลาดสัมพัทธ์มากกว่า 1/2² ดังนั้นจึงมีข้อมูลน้อยกว่า 2 บิต ความถูกต้องถูกจำกัดอย่างมากเนื่องจากช่วงมีขนาดสองลำดับ ซึ่งค่อนข้างใหญ่สำหรับการประมาณค่าประเภทนี้

การประมาณค่าที่ดีกว่ามากสามารถทำได้โดยการประมาณเชิงเส้นแบบแบ่งส่วน: ส่วนของเส้นตรงหลายส่วน แต่ละส่วนประมาณส่วนโค้งย่อยบางส่วนของส่วนโค้งเดิม ยิ่งใช้ส่วนของเส้นตรงมากเท่าไร การประมาณค่าก็จะยิ่งดีขึ้นเท่านั้น วิธีที่พบได้บ่อยที่สุดคือการใช้เส้นสัมผัส ทางเลือกที่สำคัญคือวิธีการแบ่งส่วนโค้งและตำแหน่งของจุดสัมผัส วิธีที่มีประสิทธิภาพในการแบ่งส่วนโค้งจากy = 1ถึงy = 100คือการใช้เรขาคณิต: สำหรับสองช่วง ช่วงของขอบเขตจะเป็นรากที่สองของขอบเขตของช่วงเดิม 1×100 นั่นคือ[ 1 , 2√100 ]และ[ 2√100 , 100 ]สำหรับช่วงสามช่วง ขอบเขตคือรากที่สามของ 100: [1, 3100 ], [ 3100 ,( 3100 ) 2 ]และ[( 3100 ) 2 ,100]เป็นต้น สำหรับช่วงสองช่วง2100 = 10ซึ่งเป็นจำนวนที่สะดวกมาก เส้นสัมผัสหาได้ง่าย และอยู่ที่⁠ ⁠และ⁠ ⁠สมการของเส้นสัมผัสคือ: และเมื่อกลับค่า รากที่สองคือ: และดังนั้นสำหรับ:

ค่าความคลาดเคลื่อนสัมบูรณ์สูงสุดเกิดขึ้นที่จุดสูงสุดของช่วง คือที่a = 10 และ 100 โดยมีค่า 0.54 และ 1.7 ตามลำดับ ส่วนค่าความคลาดเคลื่อนสัมพัทธ์สูงสุดเกิดขึ้นที่จุดปลายของช่วง คือที่a = 1, 10 และ 100 โดยมีค่า 17% ในทั้งสองกรณี 17% หรือ 0.17 มีค่ามากกว่า 1/10 ดังนั้นวิธีการนี้จึงให้ความแม่นยำน้อยกว่าหนึ่งตำแหน่งทศนิยม

การประมาณค่าแบบไฮเปอร์โบลิก

ในบางกรณี การประมาณค่าแบบไฮเปอร์โบลาอาจมีประสิทธิภาพ เนื่องจากไฮเปอร์โบลาเป็นเส้นโค้งนูนเช่นกัน และอาจวางตัวตามส่วนโค้งของy = x² ได้ดีกว่าเส้น ตรง การประมาณค่าแบบไฮเปอร์โบลามีความซับซ้อนในการคำนวณมากกว่า เนื่องจากจำเป็นต้องใช้การหารแบบลอยตัว การประมาณค่าแบบไฮเปอร์โบ ลาที่ใกล้เคียงค่าเหมาะสมที่สุดสำหรับในช่วง [1, 100] คือเมื่อสลับตำแหน่งแล้ว รากที่สองคือดังนั้นสำหรับ:

การหารจำเป็นต้องมีความแม่นยำเพียงทศนิยมตำแหน่งเดียว เพราะค่าประมาณโดยรวมมีความแม่นยำเพียงเท่านั้น และสามารถทำได้ในใจ ค่าประมาณแบบไฮเปอร์โบลิกนี้โดยเฉลี่ยแล้วดีกว่าค่าประมาณแบบสเกลาร์หรือเชิงเส้น มีข้อผิดพลาดสัมบูรณ์สูงสุด 1.58 ที่a = 100และข้อผิดพลาดสัมพัทธ์สูงสุดที่a = 10โดยที่ค่าประมาณ 3.67 สูงกว่ารากที่สองของ 3.16 ถึง 16.0% หากทำการคำนวณแบบนิวตัน-ราฟสันโดยเริ่มจากค่าประมาณ 10 จะต้องใช้การคำนวณสองครั้งเพื่อให้ได้ 3.66 ซึ่งตรงกับค่าประมาณแบบไฮเปอร์โบลิก สำหรับกรณีทั่วไปเช่น 75 ค่าประมาณแบบไฮเปอร์โบลิก 8.00 ต่ำกว่าความเป็นจริงเพียง 7.6% และจะต้องทำการคำนวณแบบนิวตัน-ราฟสัน 5 ครั้งโดยเริ่มจาก 75 เพื่อให้ได้ผลลัพธ์ที่แม่นยำยิ่งขึ้น

การประมาณค่าทางคณิตศาสตร์

วิธีการที่คล้ายคลึงกับการประมาณค่าเชิงเส้นแบบเป็นช่วง แต่ใช้เพียงเลขคณิตแทนสมการพีชคณิต คือการใช้ตารางการคูณในทางกลับกัน: รากที่สองของจำนวนระหว่าง 1 ถึง 100 จะอยู่ระหว่าง 1 ถึง 10 ดังนั้น ถ้าเรารู้ว่า 25 เป็นกำลังสองสมบูรณ์ (5 × 5) และ 36 เป็นกำลังสองสมบูรณ์ (6 × 6) แล้ว รากที่สองของจำนวนที่มากกว่าหรือเท่ากับ 25 แต่น้อยกว่า 36 จะเริ่มต้นด้วย 5 ในทำนองเดียวกันสำหรับจำนวนระหว่างกำลังสองอื่นๆ วิธีนี้จะให้ตัวเลขหลักแรกที่ถูกต้อง แต่ไม่แม่นยำถึงหนึ่งหลัก: ตัวอย่างเช่น ตัวเลขหลักแรกของรากที่สองของ 35 คือ 5 แต่รากที่สองของ 35 เกือบจะเป็น 6

วิธีที่ดีกว่าคือการแบ่งช่วงออกเป็นช่วงๆ โดยแบ่งครึ่งระหว่างกำลังสอง ดังนั้นสำหรับจำนวนใดๆ ที่อยู่ระหว่าง 25 และครึ่งทางของ 36 ซึ่งคือ 30.5 ให้ประมาณค่าเป็น 5; สำหรับจำนวนใดๆ ที่มากกว่า 30.5 จนถึง 36 ให้ประมาณค่าเป็น 6 [หมายเหตุ 3 ] ขั้นตอนนี้ใช้การคำนวณเพียงเล็กน้อยเพื่อหาจำนวนขอบเขตที่อยู่ตรงกลางระหว่างผลคูณสองค่าจากตารางการคูณ นี่คือตารางอ้างอิงของขอบเขตเหล่านั้น:

เอช่องสี่เหลี่ยมที่ใกล้ที่สุด ก่อตั้ง
1
1 (= 1 2 ) 1
2.5
4 (= 2 2 ) 2
6.5
9 (= 3 2 ) 3
12.5
16 (= 4 2 ) 4
20.5
25 (= 5 2 ) 5
30.5
36 (= 6 2 ) 6
42.5
49 (= 7 2 ) 7
56.5
64 (= 8 2 ) 8
72.5
81 (= 9 2 ) 9
90.5
100 (= 10 2 ) 10
100

ขั้นตอนสุดท้ายคือการคูณค่าประมาณkด้วยกำลังของสิบหารด้วย 2 ดังนั้นสำหรับ,

วิธีการนี้ให้ความแม่นยำโดยปริยายหนึ่งหลักสำคัญ เนื่องจากปัดเศษไปที่หลักแรกที่ดีที่สุด

วิธีการนี้สามารถขยายได้ถึง 3 หลักสำคัญในกรณีส่วนใหญ่ โดยการประมาณค่าระหว่างกำลังสองที่ใกล้ที่สุดที่ล้อมรอบตัวดำเนินการ ถ้าแล้วจะมีค่าประมาณเท่ากับ k บวกเศษส่วน ซึ่งก็คือผลต่างระหว่างaและหารด้วยผลต่างระหว่างกำลังสองทั้งสอง

ที่ไหน

ขั้นตอนสุดท้าย ดังที่กล่าวมาข้างต้น คือการคูณผลลัพธ์ด้วยเลขยกกำลังของสิบหารด้วย 2

kคือตัวเลขทศนิยม และRคือเศษส่วนที่ต้องแปลงเป็นทศนิยม โดยปกติแล้วเศษส่วนจะมีตัวเลขเพียงหลักเดียวในตัวเศษ และตัวเลขหนึ่งหรือสองหลักในตัวส่วน ดังนั้นการแปลงเป็นทศนิยมจึงสามารถทำได้โดยการคิดในใจ

ตัวอย่าง

หาค่ารากที่สองของ 75

ดังนั้นaคือ75 และnคือ 0 จากตารางการคูณ รากที่สองของแมนทิสซาต้องเป็น 8 จุดกว่าเพราะaอยู่ระหว่าง 8×8 = 64 และ 9×9 = 81 ดังนั้นkคือ 8 จุดกว่าๆ ซึ่งเป็นค่าทศนิยมของRในเศษส่วนRตัวเศษคือ75 − = 11 และตัวส่วนคือ81 − = 2k + 1 = 17 11/17 น้อยกว่า 12/18 = 2/3 = 0.67 เล็กน้อย ดังนั้นเดาว่า 0.66 (เดาได้ เพราะความคลาดเคลื่อนน้อยมาก) ค่าประมาณสุดท้ายคือ8 + 0.66 = 8.66

√75 เมื่อ ปัดเศษให้เหลือ 3 หลักสำคัญจะได้ 8.66 ดังนั้นค่าประมาณนี้จึงแม่นยำถึง 3 หลักสำคัญ ไม่ใช่ว่าค่าประมาณทั้งหมดที่ใช้วิธีนี้จะแม่นยำเท่านี้ แต่ก็จะใกล้เคียง

การประมาณค่าแบบไบนารี

เมื่อทำงานในระบบเลขฐานสอง (เช่นเดียวกับที่คอมพิวเตอร์ใช้ภายใน) โดยการแสดงS ในรูป โดยที่สามารถประมาณ ค่ารากที่สอง ได้ดังนี้

ซึ่งเป็นเส้นถดถอยกำลังสองน้อยที่สุดที่มีสัมประสิทธิ์สำคัญ 3 หลักมีค่าความคลาดเคลื่อนสัมบูรณ์สูงสุด 0.0408 ที่และค่าความคลาดเคลื่อนสัมพัทธ์สูงสุด 3.0% ที่ ค่าประมาณที่ปัดเศษซึ่งสะดวกในการคำนวณ (เนื่องจากสัมประสิทธิ์เป็นกำลังของ 2) คือ:

[หมายเหตุ 4 ]

ซึ่งมีค่าความคลาดเคลื่อนสัมบูรณ์สูงสุด 0.086 ที่ 2 และค่าความคลาดเคลื่อนสัมพัทธ์สูงสุด 6.1% ที่a = 0.5และa = 2.0

สำหรับการประมาณค่าแบบไบนารีจะได้ค่า ดังนั้นค่าประมาณจึงมีข้อผิดพลาดสัมบูรณ์ 19% และข้อผิดพลาดสัมพัทธ์ 5.3% ข้อผิดพลาดสัมพัทธ์น้อยกว่า 1/2 4เล็กน้อยดังนั้นค่าประมาณจึงแม่นยำถึง 4+ บิต

สามารถประมาณค่ารากที่สอง ของ 1.8515625 10 ได้อย่างแม่นยำถึง 8 บิต โดยการค้นหาในตารางจาก 8 บิตบนสุดของ ค่า 1.8515625 10 โดยจำไว้ว่าบิตบนสุดนั้นเป็นค่าโดยปริยายในรูปแบบเลขทศนิยมส่วนใหญ่ และบิตล่างสุดของเลข 8 ควรปัดเศษ ตารางนี้มีขนาด 256 ไบต์ ประกอบด้วยค่ารากที่สองที่คำนวณไว้ล่วงหน้าแล้ว 8 บิต ตัวอย่างเช่น สำหรับดัชนี 11101101 2ซึ่งแทนค่า 1.8515625 10ค่าที่ได้คือ 10101110 2ซึ่งแทนค่า 1.359375 10 ซึ่งเป็น รากที่สองของ 1.8515625 10ที่มีความแม่นยำถึง 8 บิต (2+ หลักทศนิยม)

วิธีของเฮรอน

อัลกอริทึมที่ชัดเจนแรกสำหรับการประมาณค่าเรียกว่าวิธีของเฮรอน ตาม ชื่อของนักคณิตศาสตร์ชาวกรีกในศตวรรษที่ 1 เฮโรแห่งอเล็กซานเดรียผู้ซึ่งอธิบายวิธีการนี้ในงานMetrica ของเขา ในปี ค.ศ. 60 [ 3 ]วิธีนี้เรียกอีกอย่างว่าวิธีบาบิโลน (ไม่ควรสับสนกับวิธีบาบิโลนสำหรับการประมาณค่าด้านตรงข้ามมุมฉาก ) แม้ว่าจะไม่มีหลักฐานว่า ชาวบาบิโลนรู้จักวิธีนี้ก็ตาม

กำหนดให้ x₀ > 0 เป็นจำนวนจริงบวก ใดๆ ให้x₀ > 0เป็นค่าประมาณเริ่มต้น ที่เป็น บวก วิธีของเฮรอนประกอบด้วยการคำนวณซ้ำๆ จนกว่าจะได้ความแม่นยำที่ต้องการ ลำดับที่กำหนดโดยสมการนี้จะลู่เข้าสู่

นี่เทียบเท่ากับการใช้วิธีของนิวตันในการแก้ปัญหาอัลกอริทึมนี้ลู่เข้าแบบกำลังสอง : จำนวนหลักที่ถูกต้องจะเพิ่มขึ้นเป็นสองเท่าโดยประมาณในแต่ละรอบ[ 5 ]

อนุพันธ์

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

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

ถ้าเราสมมติว่า

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

อัลกอริทึมนี้ใช้ได้ผลดีเช่นกันในจำนวนp -adic แต่ไม่สามารถใช้เพื่อระบุว่ารากที่สองของจำนวนจริงตรงกับ รากที่สองของจำนวน p -adic ได้อย่างไร ตัวอย่างเช่น เราสามารถสร้างลำดับของจำนวนตรรกยะโดยใช้วิธีนี้ ซึ่งลู่เข้าสู่+3ในจำนวนจริง แต่ลู่เข้าสู่−3ในจำนวน 2-adic

การนำไปใช้งานในภาษา Python

จากdecimal นำเข้าDecimal , localcontext , getcontextประเภทตัวเลข= จำนวนเต็ม| ทศนิยม| เลขฐานสิบdef sqrt_Heron (s : ประเภทตัวเลข,ความแม่นยำ: int | None = None ,เดา: ประเภทตัวเลข| ไม่มี= ไม่มี) -> ทศนิยม:""" คำนวณค่า sqrt(sqrt) โดยใช้วิธี Heron-Newton ด้วยความแม่นยำตามอำเภอใจ :param s: จำนวนที่ไม่เป็นลบที่ต้องการคำนวณรากที่สอง :param precision: จำนวนหลักที่มีนัยสำคัญ ค่าเริ่มต้นคือบริบททศนิยมปัจจุบัน ความแม่นยำขั้นต่ำที่รองรับคือ 2 (ไม่อนุญาตให้ตั้งค่าความแม่นยำเป็น 1 เพื่อหลีกเลี่ยงความผิดปกติจากการปัดเศษ) :param guess: ค่าคาดเดาเริ่มต้น ค่าเริ่มต้นคือ s / 2 :return: ค่าประมาณของรากที่สอง (sqrt) ที่ปัดเศษตามความแม่นยำที่ระบุ """ถ้าs == 0 :คืนค่า Decimal ( 0 )s = ทศนิยม( s )ถ้าs < 0 :raise ValueError ( "ฟังก์ชัน sqrt(s) ไม่สามารถใช้ได้กับตัวเลขติดลบ" )ถ้าความแม่นยำเป็นNone :precision = getcontext () . prec # ใช้บริบทส่วนกลางปัจจุบันหากไม่ได้ระบุไว้# บังคับใช้ความแม่นยำขั้นต่ำโดยไม่เปิดเผยตัวตนถ้าความแม่นยำ< 2 :ความแม่นยำ= 2ถ้าค่าที่เดาคือNone :เดา= ทศนิยม( s / 2 )guard = 25 # ตัวเลขเสริมชั่วคราวเพื่อความเสถียรภายในจำนวนรอบสูงสุด= 10,000# บริบทเฉพาะที่: แยกการเปลี่ยนแปลงความแม่นยำwith localcontext () as ctx :ctx . prec = precision + guardเดา= ( เดา+ s / เดา) / 2สำหรับ_ ในช่วง( max_iter ):next_guess = ( guess + s / guess ) / 2# หยุดเมื่อผลลัพธ์ที่ได้ไม่ดีขึ้นมากพอถ้าค่าที่เดา- ค่าที่เดาถัดไป< ทศนิยม( f "1e- { precision } " ):หยุดพักเดา= เดาครั้งต่อไปอื่น:raise ArithmeticError ( f "Heron method did not converge within { max_iter } iterations" )# ปัดเศษให้ได้ความแม่นยำตามเป้าหมาย (กำจัดตัวป้องกัน)ctx.prec = ความแม่นยำคืนค่า+ เดาครั้งต่อไป

ตัวอย่างการคำนวณ

ตัวอย่างต่อไปนี้แสดงการทำงานของsqrt_Heronฟังก์ชันด้วยอินพุตต่างๆ

print ( f "1) { sqrt_Heron ( 125348 , precision = 7 , guess = 600 ) } " ) print ( f "2) { sqrt_Heron ( Decimal ( '3.1415926535897932384626433832795028841971693993' )) } " ) print ( f "3) { sqrt_Heron ( 2 , 1_000_157 ) } " ) print ( f "4) { sqrt_Heron ( 2 , 10_000_005 , 1.414 ) } " ) print ( f "5) { sqrt_Heron ( 2 , 100_000_000 , 1 ) } " )

ซึ่งจะสร้างผลลัพธ์ดังต่อไปนี้:

1) 354.0452 2) 1.772453850905516027298167483 3) 1.4142135623730950488016887242 ... 269732025731849141493880004856742892 4) 1.4142135623730950488016887242 ... ... 872480508054123572727872131589714262 5) 1.4142135623730950488016887242 ... ... ... 023678977744844723443287604232894971 

โฆษณา 1)

การคำนวณค่าให้ ได้ เลขสำคัญเจ็ด หลัก มีขั้นตอนดังนี้:

ดังนั้นจึงต้องปัดเศษให้เหลือเจ็ดตำแหน่งทศนิยมสำคัญ

โฆษณา 2)การคำนวณ (ใน 6 ขั้นตอนการวนซ้ำ) ให้ได้ความแม่นยำตามค่าเริ่มต้น[หมายเหตุ 5 ]

โฆษณา 3)การคำนวณ (ใน 22 ขั้นตอนการวนซ้ำ) ถึง1,000,157 หลัก[ 6 ]

โฆษณา 4)การคำนวณ (ใน 23 ขั้นตอนการวนซ้ำ) ถึง10,000,005 หลัก[ 7 ]

ข้อ 5)การคำนวณ (ใน 28 ขั้นตอนการวนซ้ำ) ให้ได้ผลลัพธ์ถึง 100 ล้านหลัก

ดูเหมือนว่าสำหรับการคาดเดาเบื้องต้นที่สมเหตุสมผลนั้น ไม่จำเป็นต้องมีการทำซ้ำหลายรอบนัก

หมายเหตุ

คำอธิบายบรรทัดที่ 41 และ 46

วิธีการของเฮรอนมีคุณสมบัติดังต่อไปนี้:

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

ในบรรทัดที่ 41 ของโปรแกรมguessกำหนดค่าให้กับตัวแปรจากนั้นในบรรทัดที่ 46 ของโค้ดตัวแปร จะต้องไม่เป็นค่าลบ

เหตุผลของการกำหนดเกณฑ์การหยุด

โดยใช้ความแตกต่างระหว่างค่าประมาณที่ต่อเนื่องกัน

,

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

,

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

.

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

การบรรจบกัน

กราฟเซมิล็อกเปรียบเทียบความเร็วในการลู่เข้าของวิธีของเฮรอนในการหาค่ารากที่สองของ100สำหรับค่าเริ่มต้นที่คาดเดาต่างกัน ค่าที่คาดเดาเป็นลบจะลู่เข้าสู่ค่ารากลบ ค่าที่คาดเดาเป็นบวกจะลู่เข้าสู่ค่ารากบวก โปรดสังเกตว่าค่าที่อยู่ใกล้รากจะลู่เข้าได้เร็วกว่า และค่าประมาณทั้งหมดเป็นการประมาณค่าที่สูงเกินจริง ในไฟล์ SVGให้เลื่อนเมาส์ไปเหนือกราฟเพื่อแสดงจุดต่างๆ

สมมติว่าจากนั้นสำหรับจำนวนธรรมชาติใดๆให้กำหนด ข้อผิดพลาดสัมพัทธ์ใน โดย และดังนั้น

จากนั้นจึงสามารถแสดงได้ว่า

ดังนั้น การลู่เข้าจึงเกิดขึ้นอย่างแน่นอน และเป็น แบบ กำลัง สอง

กรณีที่เลวร้ายที่สุดสำหรับการบรรจบกัน

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

ดังนั้นไม่ว่ากรณีใดก็ตาม

ข้อผิดพลาดจากการปัดเศษจะทำให้การคำนวณช้าลง แนะนำให้เผื่อตัวเลขอย่างน้อยหนึ่งหลักมากกว่าความแม่นยำที่ต้องการเพื่อหลีกเลี่ยงข้อผิดพลาดจากการปัดเศษอย่าง มีนัยสำคัญ

วิธีการของแฮลลีย์

เมื่ออยู่ในโปรแกรมข้างต้น จะมีการประมาณการไว้ดังนี้ — บรรทัดที่ไฮไลต์คือบรรทัดที่ 41 และ 43 —

เดา= ( เดา+ s / เดา) / 2# ...next_guess = ( guess + s / guess ) / 2

ถูกแทนที่ด้วย

guess *= ( guess * guess + 3 * s ) / ( 3 * guess * guess + s )# ...next_guess = guess * ( guess * guess + 3 * s ) / ( 3 * guess * guess + s )

ฟังก์ชันดังsqrt_Heronกล่าวถูกแปลงเป็นการนำวิธีการของฮัลลีย์ มาใช้ โดยที่

เช่นเดียวกับในวิธีการของแฮลลีย์ การประมาณค่าไม่ได้เคลื่อนไปในทิศทางเดียวเสมอไป บรรทัดที่ 46 จะกลายเป็น

ถ้าabs ( guess - next_guess ) < Decimal ( f "1e- { precision } " ):

วิธีของ Halley มีอัตราการลู่เข้าที่เร็วกว่า — อัตราการลู่เข้าสู่รากเป็นแบบลูกบาศก์ ซึ่งดีกว่าแบบกำลังสอง —เมื่อเทียบกันแบบทีละรอบ แต่ต้องใช้การคูณถึงห้าครั้งต่อรอบ (นับการหารเป็นการคูณสามครั้ง) การคำนวณตัวอย่างทั้งห้าครั้งเสร็จสมบูรณ์ใน 4, 4, 14, 15 และ 19 รอบ ตามลำดับ ในทางตรงกันข้าม วิธีของ Heron ต้องการการหารเพียงครั้งเดียว นั่นคือการคูณสามครั้ง ดังนั้นวิธีของ Heron จึงดีกว่าเล็กน้อยในระยะยาว

วิธีการของบัคชาลี

วิธีการนี้สำหรับการหาค่าประมาณของรากที่สองได้รับการอธิบายไว้ใน ต้นฉบับ อินเดีย โบราณ ที่เรียกว่าต้นฉบับ Bakhshaliซึ่งเทียบเท่าทางพีชคณิตกับการทำซ้ำสองครั้งของวิธีของ Heron และดังนั้นจึงลู่เข้าแบบควอติก หมายความว่าจำนวนหลักที่ถูกต้องของค่าประมาณจะเพิ่มขึ้นเป็นสี่เท่าโดยประมาณในแต่ละรอบการทำซ้ำ[ 8 ]การนำเสนอแบบดั้งเดิมโดยใช้สัญลักษณ์สมัยใหม่มีดังนี้: ในการคำนวณให้เป็นค่าประมาณเริ่มต้นของจากนั้นทำซ้ำตามลำดับดังนี้:

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

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

วิธี Bakhshali สามารถขยายไปสู่การคำนวณรากใดๆ รวมถึงรากเศษส่วนได้[ 9 ]

บางคนอาจคิดว่าครึ่งหลังของวิธีการของ Bakhshali สามารถใช้เป็นรูปแบบที่ง่ายกว่าของการวนซ้ำของ Heron และใช้ซ้ำได้ อย่างไรก็ตาม วิธีนี้ไม่เสถียรทางตัวเลขหากไม่มีการอ้างอิงถึงค่าอินพุตดั้งเดิมความแม่นยำจะถูกจำกัดด้วยความแม่นยำของการคำนวณดั้งเดิมของและนั่นจะกลายเป็นสิ่งที่ไม่เพียงพออย่างรวดเร็ว

ตัวอย่าง

โดยใช้ตัวอย่างเดียวกันกับในตัวอย่างวิธีของเฮรอน การวนซ้ำครั้งแรกจะให้ผลลัพธ์ดังนี้

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

การคำนวณทีละหลัก

เทคนิคนี้มาจากผลงานของFrançois Vièteซึ่งตีพิมพ์ราวปี ค.ศ. 1600 [ 10 ]และอิงตามทฤษฎีบททวินามและโดยพื้นฐานแล้วเป็นอัลกอริทึมผกผันในการแก้ปัญหา วิธีนี้ช้ากว่าวิธีบาบิโลน แต่มีข้อดีหลายประการ:

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

ข้อเสียได้แก่:

  • รากที่อยู่สูงขึ้นไปจะควบคุมได้ยากขึ้น
  • วิธีนี้ไม่ยอมรับการคาดเดาหรือการคำนวณย่อยที่ไม่แม่นยำ เพราะข้อผิดพลาดดังกล่าวจะทำให้ตัวเลขหลักถัดไปของผลลัพธ์ผิดพลาดทั้งหมด ซึ่งแตกต่างจากวิธีของนิวตันที่แก้ไขข้อผิดพลาดในการประมาณค่าได้เองโดยอัตโนมัติ
  • แม้ว่าการคำนวณทีละหลักจะดูมีประสิทธิภาพในทางทฤษฎี แต่ก็มีต้นทุนสูงเกินไปสำหรับการนำไปใช้ในซอฟต์แวร์ แต่ละรอบการคำนวณเกี่ยวข้องกับตัวเลขที่ใหญ่ขึ้น ทำให้ต้องใช้หน่วยความจำมากขึ้น แต่จะได้คำตอบที่ถูกต้องเพิ่มขึ้นเพียงหนึ่งหลักเท่านั้น ดังนั้นอัลกอริทึมจึงใช้เวลานานขึ้นสำหรับแต่ละหลักที่เพิ่มเข้ามา

กระดูกของเนเปียร์มีส่วนช่วยในการดำเนินการของอัลกอริทึมนี้ อัลกอริทึมรากที่ n แบบเลื่อนตำแหน่ง เป็นการขยายวิธีการนี้ให้ครอบคลุมมากขึ้น

หลักการพื้นฐาน

ก่อนอื่น ให้พิจารณากรณีของการหาค่ารากที่สองของจำนวนSซึ่งก็คือค่ากำลังสองของจำนวนสองหลักฐานสิบXYโดยที่XคือหลักสิบและYคือหลักหน่วย โดยเฉพาะอย่างยิ่ง Sจะประกอบด้วยตัวเลขทศนิยม 3 หรือ 4 หลัก

ต่อไปนี้คือขั้นตอนวิธีแบบทีละหลัก เราจะแบ่งตัวเลขของS ออก เป็นสองกลุ่ม กลุ่มละสองหลัก โดยเริ่มจากด้านขวา ซึ่งหมายความว่ากลุ่มแรกจะมี 1 หรือ 2 หลัก จากนั้นเราจะหาค่าของXเป็นตัวเลขที่มากที่สุดที่ทำให้X² น้อยกว่าหรือเท่ากับกลุ่มแรก จาก นั้น เราจะคำนวณผลต่างระหว่างกลุ่มแรกกับ X² และเริ่มต้นการวนซ้ำครั้งที่ สองโดยการนำกลุ่มที่สองมาต่อท้าย ซึ่งเทียบเท่ากับการลบออกจากSและเราจะเหลือ S' ไว้เราหารS'ด้วย 10 จากนั้นหารด้วย2Xและเก็บส่วนที่เป็นจำนวนเต็มไว้เพื่อลองเดาค่าYเรานำ2X มาต่อ ท้ายกับค่าY ที่เดาไว้ และคูณด้วยYถ้าการเดาของเราถูกต้อง ซึ่งเทียบเท่ากับการคำนวณ: และดังนั้นเศษเหลือ ซึ่งก็คือผลต่างระหว่างS'กับผลลัพธ์ จะเป็นศูนย์ ถ้าผลลัพธ์สูงกว่าS'เราจะลดค่าที่คาดเดาลง 1 แล้วลองใหม่อีกครั้งจนกว่าเศษเหลือจะเป็น 0 เนื่องจากนี่เป็นกรณีที่ง่ายซึ่งคำตอบคือรากที่สองสมบูรณ์ของXYดังนั้นอัลกอริทึมจึงหยุดทำงานที่นี่

แนวคิดเดียวกันนี้สามารถขยายไปใช้กับการคำนวณรากที่สองใดๆ ก็ได้ต่อไป สมมติว่าเราสามารถหารากที่สองของS ได้ โดยการแสดง S ในรูปผลรวมของ จำนวนบวก nจำนวน โดยที่

โดยการใช้เอกลักษณ์พื้นฐานซ้ำๆ เทอม ทางด้านขวามือสามารถขยายได้ดังนี้

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

ตัวอย่างเช่น ในระบบเลขฐานสิบ เรามี โดยที่เป็นตัวแทนตำแหน่ง และ เป็นสัมประสิทธิ์ในแต่ละขั้นตอนที่ m ของการคำนวณรากที่สอง ค่ารากโดยประมาณที่พบจนถึงปัจจุบันและพจน์ผลรวมจะกำหนดโดย

เนื่องจากค่าประจำหลักของเป็นเลขยกกำลังคู่ของ 10 เราจึงจำเป็นต้องพิจารณาเฉพาะตัวเลขสองหลักที่มีค่ามากที่สุดของเศษเหลือซึ่งพจน์แรกคือในขั้นตอนที่ m ใดๆ ส่วนด้านล่างนี้จะอธิบายขั้นตอนดังกล่าวโดยละเอียด

เห็นได้ชัดว่าสามารถใช้วิธีการที่คล้ายกันในการคำนวณรากที่สองในระบบตัวเลขอื่นนอกเหนือจากระบบเลขฐานสิบได้ ตัวอย่างเช่น การหารากที่สองแบบทีละหลักในระบบเลขฐานสองนั้นค่อนข้างมีประสิทธิภาพ เนื่องจากค่าของถูกค้นหาจากชุดตัวเลขฐานสองที่เล็กกว่า {0,1} ซึ่งทำให้การคำนวณเร็วขึ้น เพราะในแต่ละขั้นตอน ค่าของจะเป็นสำหรับหรือสำหรับข้อเท็จจริงที่ว่าเรามีเพียงสองตัวเลือกที่เป็นไปได้สำหรับยังทำให้กระบวนการตัดสินใจค่าของใน ขั้นตอนที่ mของการคำนวณง่ายขึ้น เนื่องจากเราเพียงแค่ต้องตรวจสอบว่า สำหรับถ้าเงื่อนไขนี้เป็นจริง เราจะใช้ถ้าไม่เป็นจริง เราจะใช้ นอกจากนี้ ข้อเท็จจริงที่ว่าการคูณด้วย 2 ทำได้โดยการเลื่อนบิตไปทางซ้ายก็ช่วยในการคำนวณด้วย

เลขฐานสิบ (ฐาน 10)

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

เริ่มจากตัวเลขคู่ซ้ายสุด ให้ทำตามขั้นตอนต่อไปนี้สำหรับแต่ละคู่:

  1. เริ่มจากทางซ้าย นำตัวเลขคู่ที่สำคัญที่สุด (ซ้ายสุด) ที่ยังไม่ได้ใช้ (ถ้าใช้ตัวเลขทั้งหมดแล้ว ให้เขียน "00") ลงมาวางไว้ทางขวาของเศษที่เหลือจากขั้นตอนก่อนหน้า (ในขั้นตอนแรกจะไม่มีเศษเหลือ) กล่าวคือ คูณเศษที่เหลือด้วย 100 แล้วบวกตัวเลขทั้งสองเข้าด้วยกัน ค่าที่ได้จะเป็นค่าcในปัจจุบัน
  2. จงหาค่าp , yและxดังต่อไปนี้:
    • ให้pเป็นส่วนหนึ่งของรากที่หาได้แล้ว โดยไม่คำนึงถึงจุดทศนิยม (สำหรับขั้นตอนแรกp = 0)
    • จงหาจำนวนเต็มที่มากที่สุดxที่ทำให้. เราจะใช้ตัวแปรใหม่y = x (20 p + x )
      • หมายเหตุ: 20p + x คือสองเท่าของpโดยเพิ่มเลขxต่อท้ายทางด้านขวา
      • หมายเหตุ: สามารถหาค่าx ได้โดยการเดาว่า c /(20· p ) คืออะไร แล้วทำการคำนวณค่าy แบบทดลอง จากนั้นปรับค่าxขึ้นหรือลงตามความจำเป็น
    • วางตัวเลขนั้นไว้เป็นตัวเลขถัดไปของราก นั่นคือ วางไว้เหนือตัวเลขสองหลักของกำลังสองที่คุณเพิ่งดึงลงมา ดังนั้น p ตัวถัดไปจะเป็น p ตัวเดิมคูณด้วย 10 บวกx
  3. ลบy ออก จากcเพื่อสร้างเศษเหลือใหม่
  4. ถ้าเศษเหลือเป็นศูนย์และไม่มีตัวเลขใดให้ดึงลงมาอีกแล้ว แสดงว่าอัลกอริทึมสิ้นสุดลงแล้ว มิเช่นนั้น ให้กลับไปที่ขั้นตอนที่ 1 เพื่อทำซ้ำอีกครั้ง

ตัวอย่าง

หาค่ารากที่สองของ 152.2756

 1 2. 3 4 / \/ 01 52.27 56 01 1·1 ≤ 1 < 2·2 x = 1 01 y = x·x = 1·1 = 1 00 52 22·2 ≤ 52 < 23·3 x = 2 00 44 y = (20+x)·x = 22·2 = 44 08 27 243·3 ≤ 827 < 244·4 x = 3 07 29 y = (240+x)·x = 243·3 = 729 98 56 2464·4 ≤ 9856 < 2465·5 x = 4 98 56 y = (2460 + x)·x = 2464·4 = 9856 00 00 อัลกอริทึมสิ้นสุดการทำงาน: คำตอบ = 12.34

ระบบเลขฐานสอง (ฐาน 2)

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

เพื่อเพิ่มประสิทธิภาพ เราเก็บค่าและ ซึ่ง เป็น สองพจน์ของในกรณีที่ไม่เป็นศูนย์ ไว้ในตัวแปรแยกกัน:

และสามารถอัปเดตได้อย่างมีประสิทธิภาพในแต่ละขั้นตอน:

โปรดทราบว่า: ซึ่งเป็นผลลัพธ์สุดท้ายที่ส่งคืนในฟังก์ชันด้านล่าง

การดำเนินการ

โปรแกรมPythonคำนวณอัลกอริทึมนี้เป็นวิธีการแบบทีละหลัก (ทีละบิต)สำหรับรากที่สองของจำนวนเต็ม[ 11 ]

def isqrt ( x : int ) -> int : assert x >= 0 , "ค่าที่ป้อนสำหรับคำนวณรากที่สองต้องไม่ติดลบ"op : int = x # X_(n+1) res : int = 0 # c_n# d_n ซึ่งเริ่มต้นที่กำลังสูงสุดของสี่ <= n หนึ่ง: int = 1 ในขณะที่หนึ่ง<= op : หนึ่ง<<= 2 # ตอนนี้ 'หนึ่ง' เป็นกำลังสูงสุดของสี่ <= x หนึ่ง>>= 2# สำหรับ dₙ … d₀ ในขณะที่one != 0 : ถ้าop >= res + one : # ถ้า X_(m+1) ≥ Y_m แล้ว a_m = 2^m op -= res + one # X_m = X_(m+1) - Y_m res += 2 * one # c_m = c_m + 2*d_m res //= 2 # c_(m-1) = c_m / 2 one //= 4 # d_(m-1) = d_m / 4# c_(-1) คืนค่า res

อัลกอริทึมที่เร็วกว่า ทั้งในระบบเลขฐานสอง เลขฐานสิบ หรือฐานอื่นๆ สามารถทำได้โดยใช้ตารางค้นหา ซึ่งในทางปฏิบัติคือการแลกเปลี่ยนพื้นที่จัดเก็บที่มากขึ้นกับเวลาการทำงานที่ลดลง[ 12 ]

เอกลักษณ์เลขชี้กำลัง

เครื่องคิดเลขพกพามักจะมีฟังก์ชันที่ดีในการคำนวณฟังก์ชันเลขชี้กำลังและลอการิทึมธรรมชาติจากนั้นจึงคำนวณรากที่สองของSโดยใช้เอกลักษณ์ที่พบโดยใช้คุณสมบัติของลอการิทึม ( ) และเลขชี้กำลัง( ) : ตัวส่วนในเศษส่วนสอดคล้องกับ รากที่ nในกรณีข้างต้น ตัวส่วนคือ 2 ดังนั้นสมการจึงระบุว่าต้องหารากที่สอง เอกลักษณ์เดียวกันนี้ใช้เมื่อคำนวณรากที่สองด้วยตารางลอการิทึมหรือไม้บรรทัดคำนวณ

วิธีการวนซ้ำแบบสองตัวแปร

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

ขั้นตอนการเริ่มต้นของวิธีนี้คือ ในขณะที่ขั้นตอนการวนซ้ำอ่าน ว่า จากนั้น(ในขณะที่)

การลู่เข้าของและด้วยเหตุนี้ การลู่เข้าของ จึง เป็นการลู่เข้าแบบกำลังสอง

การพิสูจน์วิธีการนี้ค่อนข้างง่าย ขั้นแรก เขียนนิยามการวนซ้ำของใหม่เป็น จากนั้นก็สามารถพิสูจน์ได้โดยการอุปมานว่า และด้วยเหตุนี้ การลู่เข้าของไปสู่ผลลัพธ์ที่ต้องการจึงเกิดขึ้นได้จากการลู่เข้าของ ไปสู่ ​​0 ซึ่งเป็นผลมาจาก

วิธีนี้ได้รับการพัฒนาขึ้นราวปี 1950 โดยMV Wilkes , DJ WheelerและS. Gill [ 13 ]เพื่อใช้กับEDSACซึ่งเป็นหนึ่งในคอมพิวเตอร์อิเล็กทรอนิกส์เครื่องแรก[ 14 ]ต่อมาวิธีนี้ได้รับการขยายให้ครอบคลุมมากขึ้น ทำให้สามารถคำนวณค่าที่ไม่ใช่รากที่สองได้[ 15 ]

วิธีการวนซ้ำสำหรับรากที่สองผกผัน

ต่อไปนี้เป็นวิธีการวนซ้ำสำหรับการหาค่าผกผันของรากที่สองของSซึ่งคือเมื่อพบแล้ว ให้หาค่าโดยการคูณอย่างง่าย: การวนซ้ำเหล่านี้เกี่ยวข้องกับการคูณเท่านั้น ไม่ใช่การหาร ดังนั้นจึงเร็วกว่าวิธีบาบิโลนอย่างไรก็ตาม วิธีเหล่านี้ไม่เสถียร หากค่าเริ่มต้นไม่ใกล้เคียงกับค่าผกผันของรากที่สอง การวนซ้ำจะเบี่ยงเบนออกไปจากค่าเริ่มต้น แทนที่จะลู่เข้าหาค่าเริ่มต้น ดังนั้นจึงอาจเป็นประโยชน์ที่จะทำการวนซ้ำของวิธีบาบิโลนกับค่าประมาณคร่าวๆ ก่อนที่จะเริ่มใช้วิธีเหล่านี้

  • การนำวิธีของนิวตัน มา ใช้กับสมการจะได้วิธีการที่ลู่เข้าแบบกำลังสอง โดยใช้การคูณสามครั้งต่อขั้นตอน:
  • การวนซ้ำอีกครั้งหนึ่งได้มาจากการใช้วิธีของ Halleyซึ่งเป็นวิธี Householderอันดับสอง วิธีนี้ลู่เข้าแบบลูกบาศก์แต่เกี่ยวข้องกับการคูณห้าครั้งต่อการวนซ้ำ: [หมายเหตุ 6 ] และ
  • หากใช้เลขคณิตแบบจุดคงที่การคูณด้วย 3 และการหารด้วย 8 สามารถทำได้โดยใช้การเลื่อนบิตและการบวก หากใช้เลขคณิตแบบจุดลอยตัว วิธีของ Halley สามารถลดลงเหลือการคูณสี่ครั้งต่อรอบได้ โดยการคำนวณล่วงหน้าและปรับค่าคงที่อื่นๆ ทั้งหมดเพื่อชดเชย: และ

อัลกอริทึมของโกลด์ชมิดท์

อัลกอริทึมของโกลด์ชมิดท์เป็นส่วนขยายของการหารโกลด์ชมิดท์ซึ่งตั้งชื่อตามโรเบิร์ต เอลเลียต โกลด์ชมิดท์[ 16 ] [ 17 ]ซึ่งสามารถใช้ในการคำนวณรากที่สองได้ คอมพิวเตอร์บางเครื่องใช้อัลกอริทึมของโกลด์ชมิดท์ในการคำนวณพร้อมกันและ อัลกอริทึม ของโกลด์ชมิดท์พบว่าเร็วกว่าการวนซ้ำแบบนิวตัน-ราฟสันบนคอมพิวเตอร์ที่มี คำสั่ง คูณ-บวกแบบรวมและหน่วยประมวลผลจุดลอยตัวแบบไปป์ไลน์หรือหน่วยประมวลผลจุดลอยตัวอิสระสองหน่วย[ 18 ]

วิธีการเขียนอัลกอริทึมของโกลด์ชมิดท์แบบแรกเริ่มต้นขึ้น

(โดยทั่วไปจะใช้การค้นหาในตาราง)

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

รูปแบบที่สอง ซึ่งใช้การคูณและการบวกแบบผสมผสานเริ่มต้นขึ้น

(โดยทั่วไปจะใช้การค้นหาในตาราง)

และวนซ้ำไปเรื่อยๆ จนกว่าค่าจะเข้าใกล้ 0 มากพอ หรือจนกว่าจะถึงจำนวนรอบการวนซ้ำที่กำหนดไว้ ซึ่งจะลู่เข้าสู่ค่า และ

ซีรี่ส์เทย์เลอร์

ถ้าNเป็นค่าประมาณของ เราสามารถหาค่าประมาณที่ดีกว่าได้โดยใช้ชุดอนุกรมเทย์เลอร์ของ ฟังก์ชัน รากที่สอง :

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

การขยายเศษส่วนต่อเนื่อง

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

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

โดยการนำนิพจน์นี้ไปใช้กับพจน์ส่วนของเศษส่วน เราจะได้:

สัญกรณ์แบบกระชับการกระจายตัวเศษ/ตัวส่วนสำหรับเศษส่วนต่อเนื่อง (ข้างต้น) นั้นยุ่งยากทั้งในการเขียนและการฝังลงในระบบจัดรูปแบบข้อความ ดังนั้นนักคณิตศาสตร์จึงได้คิดค้นสัญกรณ์ทางเลือกหลายแบบเช่น:

เมื่อพิจารณาตลอดทั้งระบบ จะมีสัญลักษณ์ที่กระชับยิ่งขึ้นดังนี้: [หมายเหตุ 7 ] สำหรับเศษส่วนต่อเนื่องซ้ำ (ซึ่งรากที่สองของจำนวนที่ไม่ใช่กำลังสองสมบูรณ์ทั้งหมดเป็นเช่นนั้น) ส่วนที่ซ้ำจะแสดงเพียงครั้งเดียว โดยมีเส้นขีดบนเพื่อแสดงถึงการซ้ำที่ไม่สิ้นสุดของส่วนที่ขีดเส้นบน: [หมายเหตุ 8 ]

สำหรับ√2ค่าของa = 1 ดังนั้นการแสดงแทนคือ:

เมื่อดำเนินการตามวิธีนี้ เราจะได้เศษส่วนต่อเนื่องทั่วไปสำหรับรากที่สองดังนี้

ขั้นตอนแรกในการประเมินเศษส่วนดังกล่าว[ 19 ]เพื่อให้ได้รากคือการแทนที่เชิงตัวเลขสำหรับรากของจำนวนที่ต้องการและจำนวนตัวส่วนที่เลือก ตัวอย่างเช่น ในรูปแบบมาตรฐานr = 1และสำหรับ2 , a = 1ดังนั้นเศษส่วนต่อเนื่องเชิงตัวเลขสำหรับตัวส่วน 3 ตัวคือ:

ขั้นตอนที่ 2 คือการลดทอนเศษส่วนต่อเนื่องจากล่างขึ้นบน โดยลดทอนตัวส่วนทีละตัว เพื่อให้ได้เศษส่วนตรรกยะที่มีตัวเศษและตัวส่วนเป็นจำนวนเต็ม การลดทอนดำเนินไปดังนี้ (โดยพิจารณาตัวส่วนสามตัวแรก):

สุดท้าย (ขั้นตอนที่ 3) หารตัวเศษด้วยตัวส่วนของเศษส่วนตรรกยะเพื่อหาค่าโดยประมาณของราก โดยปัดเศษให้มีความแม่นยำสามหลัก

ค่าที่แท้จริงของ√2 คือ 1.41เมื่อปัดเศษให้เหลือสามหลักสำคัญ ความคลาดเคลื่อนสัมพัทธ์คือ 0.17% ดังนั้นเศษส่วนตรรกยะนี้จึงมีความแม่นยำเกือบสามหลัก การใช้ตัวส่วนมากขึ้นจะให้ค่าประมาณที่ดีขึ้นเรื่อยๆ เช่น ตัวส่วนสี่ตัวจะได้เศษส่วน ซึ่งมีความแม่นยำเกือบสี่หลัก เป็นต้น

ต่อไปนี้เป็นตัวอย่างของรากที่สอง เศษส่วนต่อเนื่องอย่างง่าย และพจน์แรก ๆ ของรากที่สอง ซึ่งเรียกว่าพจน์ลู่เข้า โดยที่ตัวส่วนไม่เกิน 99:

S~ทศนิยม เศษส่วนต่อเนื่อง บรรจบกัน
21.41421
31.73205
52.23607
62.44949
103.16228
1.77245
1.64872
1.27202

โดยทั่วไป ยิ่งตัวส่วนของเศษส่วนตรรกยะมีค่ามากเท่าไร การประมาณค่าก็จะยิ่งดีขึ้นเท่านั้น นอกจากนี้ยังสามารถแสดงได้ว่า การตัดทอนเศษส่วนต่อเนื่องจะให้เศษส่วนตรรกยะที่ประมาณค่ารากของเศษส่วนใดๆ ที่มีตัวส่วนน้อยกว่าหรือเท่ากับตัวส่วนของเศษส่วนนั้นได้ดีที่สุด — ตัวอย่างเช่น ไม่มีเศษส่วนใดที่มีตัวส่วนน้อยกว่าหรือเท่ากับ 70 ที่ประมาณค่า √2 ได้ดีเท่ากับ 99/70

การประมาณค่าที่ขึ้นอยู่กับการแสดงผลแบบจุดลอยตัว

ตัวเลขจะถูกแสดงใน รูปแบบ จุดลอยตัวเป็นซึ่งเรียกอีกอย่างว่าสัญกรณ์วิทยาศาสตร์รากที่สองของมันคือและสูตรที่คล้ายกันนี้จะใช้ได้กับรากที่สามและลอการิทึม ดูเผินๆ แล้วนี่ไม่ใช่การปรับปรุงความเรียบง่าย แต่สมมติว่าต้องการเพียงค่าประมาณเท่านั้น ดังนั้น ก็เพียงพอแล้วสำหรับการประมาณค่าในระดับหนึ่ง ต่อไป ให้สังเกตว่าเลขชี้กำลังบางตัวpจะเป็นเลขคี่ ดังนั้น 3141.59 = 3.14159 × 103แทนที่จะจัดการกับเลขยกกำลังที่เป็นเศษส่วนของฐาน ให้คูณแมนทิสซาด้วยฐานแล้วลบหนึ่งออกจากเลขยกกำลังเพื่อให้เป็นเลขคู่ การแสดงผลที่ปรับแล้วจะเทียบเท่ากับ 31.4159 × 102ดังนั้นรากที่สองจะเป็น31.4159 × 101 .

หากนำส่วนจำนวนเต็มของแมนทิสซาที่ปรับแล้วมาใช้ จะมีค่าได้เพียง 1 ถึง 99 เท่านั้น และสามารถใช้เป็นดัชนีในตารางรากที่สองที่คำนวณไว้ล่วงหน้า 99 ค่า เพื่อทำการประมาณค่าให้เสร็จสมบูรณ์ คอมพิวเตอร์ที่ใช้ฐานสิบหกจะต้องการตารางที่ใหญ่กว่า แต่คอมพิวเตอร์ที่ใช้ฐานสองจะต้องการเพียงสามรายการเท่านั้น บิตที่เป็นไปได้ของส่วนจำนวนเต็มของแมนทิสซาที่ปรับแล้วคือ 01 (เลขชี้กำลังเป็นเลขคู่ จึงไม่มีการเลื่อนบิต โปรดจำไว้ว่า จำนวน ทศนิยมแบบนอร์มาไลซ์จะมีหลักลำดับสูงที่ไม่เป็นศูนย์เสมอ) หรือหากเลขชี้กำลังเป็นเลขคี่ จะเป็น 10 หรือ 11 ซึ่งเป็นสองบิตแรกของแมนทิสซาเดิม ดังนั้น 6.25 = 110.01 ในเลขฐานสอง เมื่อปรับค่าเป็น 1.1001 × 2² ซึ่งเป็นเลขยกกำลังคู่ ดังนั้นบิตคู่ของแมนทิสซาจึงเป็น 01 ในขณะที่ 0.625 = 0.101 ในเลขฐานสอง เมื่อปรับค่าเป็น 1.01 × 2⁻¹ ซึ่งเป็นเลขยกกำลังคี่ ดังนั้นการปรับค่าจึงเป็น 10.1 × 2⁻² และบิตคู่คือ 10 สังเกตว่าบิตลำดับต่ำของเลขยกกำลังจะสะท้อนอยู่ในบิตลำดับสูงของแมนทิสซาแบบคู่ เลขยกกำลังคู่จะมีบิตลำดับต่ำเป็นศูนย์ และแมนทิสซาที่ปรับแล้วจะเริ่มต้นด้วย 0 ในขณะที่เลขยกกำลังคี่ บิตนั้นจะเป็น 1 และแมนทิสซาที่ปรับแล้วจะเริ่มต้นด้วย 1 ดังนั้น เมื่อเลขยกกำลังถูกหารครึ่ง มันก็เหมือนกับว่าบิตลำดับต่ำของมันถูกเลื่อนออกไปเป็นบิตแรกของแมนทิสซาแบบคู่

ตารางที่มีเพียงสามรายการสามารถขยายได้โดยการเพิ่มบิตเพิ่มเติมของแมนทิสซา อย่างไรก็ตาม ในคอมพิวเตอร์ แทนที่จะคำนวณการประมาณค่าในช่วงลงในตาราง มักจะดีกว่าที่จะหาวิธีการคำนวณที่ง่ายกว่าซึ่งให้ผลลัพธ์ที่เทียบเท่ากัน ทุกอย่างขึ้นอยู่กับรายละเอียดที่แน่นอนของรูปแบบการแสดงผล รวมถึงการดำเนินการที่มีอยู่เพื่อเข้าถึงและจัดการส่วนต่างๆ ของตัวเลข ตัวอย่างเช่น ภาษาฟอร์ทรานมีEXPONENT(x)ฟังก์ชันสำหรับหาค่ากำลัง ความพยายามที่ใช้ไปในการคิดค้นค่าประมาณเริ่มต้นที่ดีจะได้รับการชดเชยโดยการหลีกเลี่ยงการทำซ้ำเพิ่มเติมของกระบวนการปรับปรุงที่จะต้องใช้สำหรับการประมาณค่าที่ไม่ดี เนื่องจากจำนวนการทำซ้ำเหล่านี้มีน้อย (การทำซ้ำหนึ่งครั้งต้องใช้การหาร การบวก และการหารครึ่ง) ข้อจำกัดจึงรุนแรง

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

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

ตัวอย่างเช่น 1.0 แทนด้วยเลขฐานสิบหก0x3F800000ซึ่งถ้าแปลงเป็นจำนวนเต็มจะได้ 0.0 โดยใช้สูตรข้างต้นจะได้ 0.0 ตามที่คาดไว้จาก1.5 (0x3FC00000) ในทำนองเดียวกัน คุณจะได้ 0.5 จาก 1.5 ( 0x3FC00000 )

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

/* สมมติว่า float อยู่ในรูปแบบเลขทศลอยความแม่นยำเดี่ยว IEEE 754 */ #include <stdint.h>ยูเนียนFloatUInt { float f ; uint32_t i ; }float sqrtApprox ( float z ) { union FloatUInt val = { z }; // แปลงชนิดข้อมูลโดยคงรูปแบบบิตไว้/*  * เพื่อพิสูจน์ความถูกต้องของโค้ดต่อไปนี้ ให้พิสูจน์ว่า *  * ((((val.i / 2^m) - b) / 2) + b) * 2^m = ((val.i - 2^m) / 2) + ((b + 1) / 2)  *  * โดยที่ *  * b = ค่าเบี่ยงเบนของเลขชี้กำลัง * m = จำนวนบิตของแมนทิสซา */ val . i -= 1 << 23 ; // ลบ 2^m val . i >>= 1 ; // หารด้วย 2 val . i += 1 << 29 ; // บวก ((b + 1) / 2) * 2^m// แปลงกลับ เป็น ค่า float อีกครั้ง val.f ; }

การดำเนินการทางคณิตศาสตร์ทั้งสามอย่างที่เป็นแก่นของฟังก์ชันข้างต้นสามารถแสดงได้ในบรรทัดเดียว สามารถเพิ่มการปรับแต่งเพิ่มเติมเพื่อลดข้อผิดพลาดสัมพัทธ์สูงสุดได้ ดังนั้น การดำเนินการทั้งสามอย่าง (ไม่รวมการแปลงประเภท) สามารถเขียนใหม่ได้ดังนี้

val.i = ( 1 << 29 ) + ( val.i >> 1 ) - ( 1 << 22 ) + a ;

โดยที่aคือค่าความเอนเอียงสำหรับปรับแก้ข้อผิดพลาดในการประมาณค่า ตัวอย่างเช่น เมื่อa = 0 ผลลัพธ์จะแม่นยำสำหรับเลขยกกำลังคู่ของ 2 (เช่น 1.0) แต่สำหรับเลขอื่นๆ ผลลัพธ์จะคลาดเคลื่อนเล็กน้อย (เช่น 1.5 สำหรับ 2.0 แทนที่จะเป็น 1.414... โดยมีข้อผิดพลาด 6%) เมื่อa = − 0x4B0D2ข้อผิดพลาดสัมพัทธ์สูงสุดจะลดลงเหลือ ±3.5% สำหรับa = 0 ค่าประมาณจะมากกว่าหรือเท่ากับรากที่สองของvalสำหรับค่าval ใด ๆ

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

สามารถปรับปรุงการประมาณค่าให้ดียิ่งขึ้นได้โดยการรวมการบวกของa , 1 << 29 และ -1 << 22 เข้าไว้ในการดำเนินการเดียว ซึ่งจะส่งผล(val.i >> 1) + 0x1FBB4F2Eให้ a = &minus 0x4B0D2ช่วยลดการแก้ไขข้อผิดพลาดให้น้อยที่สุด และสำหรับa = 0 (val.i >> 1) + 1FC00000

ส่วนกลับของรากที่สอง

ตัวแปรของรูทีนข้างต้นรวมอยู่ด้านล่าง ซึ่งสามารถใช้คำนวณส่วนกลับของรากที่สองได้ กล่าวคือ เขียนโดย Greg Walsh การประมาณค่าการเลื่อนจำนวนเต็มทำให้เกิดข้อผิดพลาดสัมพัทธ์น้อยกว่า 4% และข้อผิดพลาดลดลงเหลือ 0.15% ด้วยการวนซ้ำหนึ่งครั้งของวิธีของนิวตันในบรรทัดถัดไป[ 20 ]ในกราฟิกคอมพิวเตอร์ เป็นวิธีที่มีประสิทธิภาพมากในการทำให้เวกเตอร์เป็นมาตรฐาน

ยูเนียนFloatInt { float x ; int i ; };float inv_sqrt ( float x ) { float xhalf = 0.5f * x ; union FloatInt u ; u . x = x ; u . i = 0x5f375a86 - ( u . i >> 1 ); // บรรทัดถัดไปสามารถทำซ้ำได้หลายครั้งเพื่อเพิ่มความแม่นยำu . x = u . x * ( 1.5f - xhalf * u . x * u . x ); return u . x ; }

ฮาร์ดแวร์ VLSI บางตัวใช้การประมาณค่าพหุนามดีกรีสองเพื่อดำเนินการหาค่าผกผันของรากที่สอง ตามด้วยการ วนซ้ำแบบโกลด์ช มิดท์[ 21 ]

สี่เหลี่ยมเชิงลบหรือสี่เหลี่ยมเชิงซ้อน

ถ้าS  < 0 แล้วรากที่สองหลักของมันคือ

ถ้าS  =  a + biโดยที่aและbเป็นจำนวนจริงและb  ≠ 0 แล้วรากที่สองหลักของมันคือ

สามารถตรวจสอบได้โดยการยกกำลังสองของราก[ 22 ] [ 23 ] ที่นี่

คือค่าสัมบูรณ์ของSรากที่สองหลักของจำนวนเชิงซ้อนถูกกำหนดให้เป็นรากที่มีส่วนจริงไม่เป็นลบ

ดูเพิ่มเติม

หมายเหตุ

  1. ^ใช้ตัวประกอบสองและหกเนื่องจากเป็นค่าประมาณของค่าเฉลี่ยเรขาคณิตของค่าต่ำสุดและสูงสุดที่เป็นไปได้ด้วยจำนวนหลักที่กำหนด:และ
  2. ^ค่าประมาณที่ไม่ปัดเศษมีค่าความคลาดเคลื่อนสัมบูรณ์สูงสุด 2.65 ที่ 100 และค่าความคลาดเคลื่อนสัมพัทธ์สูงสุด 26.5% ที่ y=1, 10 และ 100
  3. ^ถ้าตัวเลขนั้นอยู่กึ่งกลางระหว่างกำลังสองสองจำนวนพอดี เช่น 30.5 ให้เดาตัวเลขที่มากกว่า ซึ่งในกรณีนี้คือ 6
  4. ^นี่คือสมการของเส้นสัมผัสของ y = ที่ y = 1 โดย บังเอิญ
  5. ^ความแม่นยำเริ่มต้นสามารถอยู่ในช่วงตั้งแต่ 1 ถึงdecimal.MAX_PREC
  6. ^ดูด้านบน
  7. ^ดู:เศษส่วนต่อเนื่อง #สัญลักษณ์
  8. ^ดู:เศษส่วนต่อเนื่องตามคาบ

บรรณานุกรม

  • Abramowitz, Milton ; Stegun, Irene A. ,บรรณาธิการ (1970) [1964]. คู่มือฟังก์ชันทางคณิตศาสตร์พร้อมสูตร กราฟ และตารางทางคณิตศาสตร์ชุดคณิตศาสตร์ประยุกต์ 55 (ฉบับพิมพ์ครั้งที่เก้า) วอชิงตัน ดี.ซี.: สำนักพิมพ์โดเวอร์ ISBN 978-0-486-61272-0. LCCN  64-60036 . MR  0167642 .
  • เบลีย์, เดวิด; บอร์เวน, โจนาธาน (2012). "รากที่สองของชาวอินเดียโบราณ: แบบฝึกหัดในคณิตศาสตร์โบราณเชิงนิติวิทยาศาสตร์" (PDF) . American Mathematical Monthly . เล่มที่ 119, ฉบับที่ 8. หน้า  646–657 . สืบค้นเมื่อ14 กันยายน 2017 .
  • Campbell-Kelly, Martin (กันยายน 2009). "ต้นกำเนิดของการคำนวณ". Scientific American . 301 (3): 62– 69. Bibcode : 2009SciAm.301c..62C . doi : 10.1038/scientificamerican0909-62 . JSTOR  26001527. PMID  19708529 .
  • Cooke, Roger (2008). พีชคณิตคลาสสิก: ธรรมชาติ ที่มา และการใช้งาน . สำนักพิมพ์ John Wiley and Sons. ISBN 978-0-470-25952-8.
  • Fowler, David; Robson, Eleanor (1998). "การประมาณค่ารากที่สองในคณิตศาสตร์บาบิโลนโบราณ: YBC 7289 ในบริบท" (PDF) . Historia Mathematica . 25 (4): 376. doi : 10.1006/hmat.1998.2209 .
  • Gower, John C. (1958). "หมายเหตุเกี่ยวกับวิธีการวนซ้ำสำหรับการสกัดราก"วารสารคอมพิวเตอร์ 1 ( 3): 142– 143. doi : 10.1093/comjnl/1.3.142 .
  • กาย, มาร์ติน (1985). "การหาค่ารากที่สองของจำนวนเต็มอย่างรวดเร็วด้วยอัลกอริทึมลูกคิดของนายวู"มหาวิทยาลัยเคนต์ วิทยาเขตแคนเทอร์เบอรี (UKC). เก็บถาวรจากต้นฉบับเมื่อวันที่ 6 มีนาคม 2012. สืบค้นเมื่อ5 ตุลาคม 2025 .
  • ฮีธ, โทมัส (1921). ประวัติศาสตร์คณิตศาสตร์กรีก เล่ม 2.อ็อกซ์ฟอร์ด: สำนักพิมพ์แคลเรนดอน. หน้า  323–324 .
  • Jackson, Terence (1 กรกฎาคม 2011). "95.42 รากที่สองของจำนวนอตรรกยะของจำนวนธรรมชาติ — แนวทางทางเรขาคณิต" The Mathematical Gazette . 95 (533): 327– 330. doi : 10.1017/S0025557200003193 . ISSN  0025-5572 . S2CID  123995083 .
  • Johnson, SG (4 กุมภาพันธ์ 2015). "การหาค่ารากที่สองด้วยวิธีของนิวตัน" (PDF) . หลักสูตร MIT 18.335: บทนำสู่วิธีการเชิงตัวเลข. สืบค้นเมื่อ12 ตุลาคม 2025 .
  • โลมอนต์, คริส (2003). "การหาค่าผกผันกำลังสองอย่างรวดเร็ว" (PDF )
  • Markstein, Peter (พฤศจิกายน 2004). การหารและการหาค่ารากที่สองด้วยซอฟต์แวร์โดยใช้อัลกอริทึมของ Goldschmidt (PDF)การ ประชุมเรื่อง จำนวนจริงและคอมพิวเตอร์ ครั้งที่ 6เมืองDagstuhlประเทศเยอรมนีCiteSeerX  10.1.1.85.9648
  • เนมิรอฟฟ์, โรเบิร์ต; บอนเนลล์, เจอร์รี (1994). "รากที่สองของ 2 ถึง 1 ล้านหลัก" . ภาพดาราศาสตร์ประจำวันของ NASA . สืบค้นเมื่อ21 ตุลาคม 2025 .
  • เนมิรอฟฟ์, โรเบิร์ต; บอนเนลล์, เจอร์รี (1994a). "รากที่สองของ 2 ถึง 10 ล้านหลัก" . ภาพดาราศาสตร์ประจำวันของ NASA . สืบค้นเมื่อ21 ตุลาคม 2025 .
  • Piñeiro, José-Alejandro; Díaz Bruguera, Javier (ธันวาคม 2002). "การคำนวณค่าผกผัน การหาร รากที่สอง และรากที่สองผกผันด้วยความแม่นยำสูง" . IEEE Transactions on Computers . 51 (12): 1377– 1388. Bibcode : 2002ITCmp..51.1377P . doi : 10.1109/TC.2002.1146704 .
  • Sardina, Manny (2007). "วิธีการทั่วไปในการสกัดรากโดยใช้เศษส่วนต่อเนื่อง (พับ)" . Surrey (สหราชอาณาจักร).
  • Simply Curious (5 มิถุนายน 2018). "การศึกษาต้นฉบับ Bakhshali" . บล็อก Simply Curious . สืบค้นเมื่อ 21 ธันวาคม 2020 .
  • สไตนาร์สัน, อาร์เน; คอร์บิต, แดนน์; เฮนดรี, แมทธิว (2003) "ฟังก์ชันรากที่สองของจำนวนเต็ม "
  • Wilkes, MV ; Wheeler, DJ ; Gill, S. (1951). การเตรียมโปรแกรมสำหรับคอมพิวเตอร์ดิจิทัลอิเล็กทรอนิกส์ . อ็อกซ์ฟอร์ด: Addison-Wesley. หน้า 262. OCLC  475783493 .
  • Baumann, Claude (2024). "เล่นกับรากที่สอง" (PDF) . computarium.lcd . สืบค้นเมื่อ28 มกราคม 2026 .
  • ไวส์สไตน์, เอริค ดับเบิลยู. "อัลกอริทึมรากที่สอง" . แมธเวิลด์ .
  • Jarvis, AF "การหาค่ารากที่สองโดยวิธีลบ" (PDF) . afjarvis.staff.shef.ac.uk . เก็บถาวรจากไฟล์ต้นฉบับ(PDF)เมื่อวันที่ 10 เมษายน 2022
  • ราโดวิช, อันดริยา. "อัลกอริทึมรากที่สองของจำนวนเต็ม " andrijar.com ​สืบค้นเมื่อ7 พฤศจิกายน 2568 .
  • เอ็กเบิร์ต, วิลเลียม อี. (พฤษภาคม 1977). "อัลกอริทึมเครื่องคิดเลขส่วนบุคคล ตอนที่ 1: รากที่สอง" (PDF) . วารสารฮิวเลตต์-แพคการ์ด : 22–24 . สืบค้นเมื่อ7 พฤศจิกายน 2025 .
  • "เครื่องคิดเลขสำหรับเรียนรู้การ หาค่ารากที่สอง" calculatorsquareroot.com สืบค้นเมื่อ7 พฤศจิกายน 2025
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Square_root_algorithms&oldid=1356063547 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ อัลกอริทึมรากที่สอง

อัลกอริทึมรากที่สอง คำนวณ รากที่สอง ที่ไม่เป็นลบของจำนวน จริง บวก เนื่องจากรากที่สองของจำนวนธรรมชาติ ทั้งหมด ยกเว้นกำลังสองสมบูรณ์เป็นจำนวนอตรรกยะ...

ประวัติศาสตร์

วิธีการหาค่ารากที่สอง (โดยเฉพาะ รากที่สองของ 2 ) เป็นที่รู้จักกันมาอย่างน้อยตั้งแต่สมัยบาบิโลนโบราณในศตวรรษที่ 17 ก่อนคริสตกาล นักคณิตศาสตร์ชาวบาบิโลน คำนวณรากที่สองของ 2 ได้ถึงสาม หลักฐาน หกสิบ หลังจาก 1 แต่ไม่ทราบแน่ชัดว่าคำนวณอย่างไร...

การประเมินเบื้องต้น

อัลกอริทึมการหาค่ารากที่สองแบบวนซ้ำหลายๆ วิธี จำเป็นต้องใช้ ค่าเริ่มต้น (seed value ) ค่าเริ่มต้นนี้ต้องเป็นจำนวนบวกที่ไม่เป็นศูนย์ ควรอยู่ระหว่าง 1 ถึงn ซึ่งเป็นจำนวนที่ต้องการหาค่ารากที่สอง เพราะค่ารากที่สองต้องอยู่ในช่วงนั้น...

การประมาณค่าแบบทศนิยม

โดยทั่วไปแล้ว ตัวเลขจะถูกแสดงใน สัญกรณ์วิทยาศาสตร์ เป็นโดยที่และ n เป็นจำนวนเต็ม และช่วงของรากที่สองที่เป็นไปได้คือโดย ที่ เอส {\displaystyle S} เอ × 10 2 n {\displaystyle a\times 10^{2n}} 1 ≤ เอ < 100 {\displaystyle 1\leq a<100} เอ × 10 n {\displaystyle...