ได้มีผู้สอบถามเกี่ยวกับการหารากที่สองของเลขฐานสอง เช่น รากที่สองของ 101110 เป็นเท่าใด ?
วิธีหนึ่งในการแก้ปัญหาที่ผมจะเสนอคือ การแปลงเลขฐานสองนั้นกลับเป็นเลขฐานสิบก่อน แล้วหารากที่สอง
ของเลขฐานสิบครับ โดยแยกคำตอบออกเป็นจำนวนเต็มหน้าทศนิยม และจำนวนหลังทศนิยม โดยกำหนด
Precision ของทศนิยมที่เราต้องการไว้ เช่น 8 ตำแหน่ง แม้ผลรากที่สองจะได้จำนวนหลังทศนิยมมากกว่า
8 ตำแหน่ง เราก็จะใช้วิธีปัดเศษให้ได้ 8 ตำแหน่ง และแปลงจำนวนหลังทศนิยมให้เป็นเลขฐานสอง
คำตอบที่เราจะได้ ควรอยู่ในรูปของ (ตัวอย่างเพื่อประกอบความเข้าใจ) 11100.11011 เป็นต้น
ซึ่งมีค่าเท่ากับตัวเลขฐานสิบคือ
a) จำนวนเต็มหน้าทศนิยม = 1 x 2^4 + 1 x 2^3 + 1 x 2^2 + 0 x 2^1 + 0 x 2^0 = 28
b) จำนวนหลังทศนิยม = 1 x (1/2) + 1 x (1/2)^2 + 0 x (1/2)^3 + 1 x (1/2)^4 + 1 x (1/2)^5 = 0.84375
เพื่อน ๆ ที่เคยอ่านกระทู้ก่อน ๆ คงจำได้ว่าเราได้เคยพูดถึงเรื่องนี้ไปแล้วครั้งหนึ่ง ในการคิดระบบเลขฐานที่ติดลบ
เพื่อสอบสัมภาษณ์เข้าทำงานในบริษัทไมโครซอฟท์ครับ ซึ่งเพื่อนท่านหนึ่งได้นำมาโพสต์
ในกระทู้นี้เราจะได้ลงในรายละเอียดของการใช้ VBA & EXCEL ในการแปลงจำนวนจริงซึ่งมีจำนวนหลังทศนิยม
8 ตำแหน่งให้เป็นตัวเลขระบบฐานสอง ซึ่งจะถูกรวมไว้ในโปรแกรมที่ผมออกแบบไว้ สำหรับการแปลงเลขฐานสิบ เป็น
ฐานสอง และฐานสิบหก (หรือในทางกลับกันด้วยครับ) โปรแกรมนี้พัฒนาขึ้นโดย EXCEL2000 ครับ ซึ่งจะรันได้ดีที่สุดใน Version 2000 ส่วนใน Version 97 อาจมี
ปัญหา (แต่ก็ไม่แน่ครับลองรันดูอาจใช้ได้)
การแปลงเลขฐานอื่นมาเป็นฐานสิบนั้นไม่ลำบากเลย ถ้าเทียบกับการแปลงเลขฐานสิบเป็นฐานอื่น ซึ่งซับซ้อน กว่าพอสมควร โดยเฉพาะในกรณีของเลขฐานสิบหก สำหรับเพื่อน ๆ ที่อยากฝึกทักษะโปรแกรมมิ่ง นี่เป็นอีก โจทย์ปัญหาหนึ่งที่น่าสนใจและท้าทายครับ (ระดับความยากในความเห็นของผม 7/10) ^ ^
ข้อดีของการออกแบบโปรแกรมใด ๆ ก็คือไม่มีอะไรที่ตายตัวครับ (เหมือนงานศิลปะ) ตัวอย่างโปรแกรมที่ผมจะเสนอ เป็นเพียงหนึ่งในหลาย ๆ รูปแบบที่อาจเป็นได้ ตราบใดที่โปรแกรมทำงานได้ผลดีอย่างที่ผู้ใช้ต้องการ ก็นับว่าประสบความสำเร็จครับ
เรามาพิจารณาการแปลงตัวเลข 28.84375 ในระบบฐานสิบให้กลายเป็นระบบฐานสองกันครับ
การแปลงเลขระบบฐานสิบไปเป็นระบบฐานสองนั้น หลายท่านคงคุ้นเคยกันดีแล้ว ข้อมูลในเวปไซต์มีดาษดื่นครับ
หลังจากการคำนวณ เลข 28 ในระบบฐานสองก็คือ 11100
ส่วน 0.84375 เราคำนวณโดยการเปรียบเทียบกับ
0.5^1 ไปจนถึง 0.5^25 (ในกรณีนี้ผมให้ความละเอียดของ คู่นิยม --> ประยุกต์จากทศนิยมครับ ^ ^ )
ถึงตำแหน่งที่ 25 หรือ 2.980 x 10^(-8)
ขั้นแรก กำหนด String A ให้ประกอบไปด้วยชื่อตำแหน่งของ คู่นิยม ทั้ง 25 ตัว ในกรณีนี้ผมให้
A = T(1)T(2)T(3)T(4)T(5)T(6)
.T(20)T(21)T(22)T(23)T(24)T(25)
ขั้นที่สอง กำหนด Variable Remainder ซึ่งมีค่าแรกสุดคือ 0.84375
เปรียบเทียบค่านี้กับ 0.5^1 จนถึง 0.5^25 จะพบว่า 0.84375 มากกว่า 0.5^1 อยู่ 0.34375 ดังนั้นให้ค่า T(1) = 1
ต่อมา เปรียบเทียบ 0.34375 พบว่ามากกว่า 0.5^2 = 0.25 อยู่ 0.09375 ดังนั้นให้ค่า T(2) = 1
ต่อมา เปรียบเทียบ 0.09375 พบว่าน้อยกว่า 0.5^3 = 0.125 ละเว้นการเปลี่ยน T(3) ค้นหาค่าต่อไป
ต่อมา เปรียบเทียบ 0.09375 พบว่ามากกว่า 0.5^4 = 0.0625 อยู่ 0.03125 ดังนั้นให้ค่า T(4) = 1
ต่อมา เปรียบเทียบ 0.03125 พบว่าเท่ากับ 0.5^5 = 0.03125 ดังนั้นให้ค่า T(5) = 1 และ Remainder เหลือ
ศูนย์ ดังนั้นหยุดการค้นหา จากนั้นเปลี่ยนชื่อตำแหน่ง คู่นิยม ที่ไม่ถูกเปลี่ยนให้เป็น 0 ทั้งหมด และตัดเลข
ศูนย์ทางขวามือที่ไม่ได้ใช้ออก (Truncate) จนกระทั่งได้คำตอบหลังจุด คู่นิยม เป็น 0.11011 ตรงตามที่เรากำหนด
ไว้ครั้งแรก
ขั้นที่สาม รวมจำนวนเต็มหน้าและหลังจุด คู่นิยม เข้าด้วยกันจะได้ 11100.11011 เป็นอันเสร็จการคำนวณ
จากภาพข้างล่าง จะเห็นผลลัพธ์ของการหารากที่สองของตัวเลขฐานสอง 10111 (หรือในระบบฐานสิบคือ 23,
ระบบฐานสิบหก คือ 17) ผมตรวจสอบคำตอบดังกล่าวแล้ว พบว่า รากที่สองของ 23 คือ
4.79583152 เมื่อแปลงคำตอบจากระบบฐานสองกลับเป็นฐานสิบได้คำตอบคือ 4.79583150 ซึ่งใกล้เคียง
กันมากครับ ^ ^
เรามาดูตัวอย่างที่สลับซับซ้อนขึ้นอีกครับ
Base 10 = 1 Base 2 = 1 Square root = 1
Base 10 = 2 Base 2 = 10 Square root = 1.01101010000010011110011
Base 10 = 3 Base 2 = 11 Square root = 1.10111011011001111010111
Base 10 = 4 Base 2 = 100 Square root = 10
Base 10 = 5 Base 2 = 101 Square root = 10.001111000110111011110011
Base 10 = 6 Base 2 = 110 Square root = 10.01110011000100011100001
Base 10 = 7 Base 2 = 111 Square root = 10.101001010100111111110101
Base 10 = 8 Base 2 = 1000 Square root = 10.1101010000010011110011001
Base 10 = 9 Base 2 = 1001 Square root = 11
Base 10 = 10 Base 2 = 1010 Square root = 11.001010011000101100000111
Base 10 = 11 Base 2 = 1011 Square root = 11.01010001000011100101001
Base 10 = 12 Base 2 = 1100 Square root = 11.0111011011001111010111001
Base 10 = 13 Base 2 = 1101 Square root = 11.100110110000010101101
Base 10 = 14 Base 2 = 1110 Square root = 11.10111101110111010100001
Base 10 = 15 Base 2 = 1111 Square root = 11.11011111011110111101011
Base 10 = 16 Base 2 = 10000 Square root = 100
Base 10 = 17 Base 2 = 10001 Square root = 100.0001111110000011110110011
Base 10 = 18 Base 2 = 10010 Square root = 100.001111100001110110110011
Base 10 = 19 Base 2 = 10011 Square root = 100.010110111110000011001101
Base 10 = 20 Base 2 = 10100 Square root = 100.0111100011011101111001101
Base 10 = 21 Base 2 = 10101 Square root = 100.10010101001000111010111
Base 10 = 22 Base 2 = 10110 Square root = 100.10110000101111110001011
Base 10 = 23 Base 2 = 10111 Square root = 100.110010111011101110011101
Base 10 = 24 Base 2 = 11000 Square root = 100.1110011000100011100001001
Base 10 = 25 Base 2 = 11001 Square root = 101