CodeQuiz EP.23 - คอมฯ เก็บทศนิยมยังไง?

https://storage.googleapis.com/code-leagues/Suttitat_Sangsuwan_81730d8b3d/Suttitat_Sangsuwan_81730d8b3d.png

พี่ชีต้าร์ สุทธิทัต

เผยแพร่เมื่อ

อัปเดตล่าสุดเมื่อ

CodeQuiz EP.23 - คอมฯ เก็บทศนิยมยังไง?

📌 สาระสำคัญ

  • วิธีการแปลงเลขทศนิยมฐาน 10 เป็นฐาน 2
  • วิธีเก็บเลขทศนิยมในคอมพิวเตอร์โดยใช้หลัก IEEE754
  • ข้อดีและข้อเสียของ IEEE754 มีอะไรบ้าง?

คอมพิวเตอร์เก็บทศนิยมยังไง?

จาก EP เก่า ๆ เรารู้แล้วแล้วว่า คอมพิวเตอร์เก็บเลขจำนวนเต็มเป็นเลขฐาน 2

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 2.png

ถ้าหากจำวิธีการแปลงไม่ได้ สามารถกลับไปดู EP เก่าๆได้นะ


โดยการแปลงเลขทศนิยมเป็นเลขฐาน 2 มี 3 ขั้นตอนด้วยกัน

ขั้นตอนแรก เราจะแบ่งตัวเลขทศนิยมเป็น 2 ส่วน ได้แก่ ส่วนหน้าจุดทศนิยม และส่วนหลังจุดทศนิยม

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 4.png

ขั้นตอนที่สอง เราแปลงเลขหน้าจุดทศนิยมเป็นเลขฐาน 2 ได้เลย โดยตัวเลขนี้จะนำไปอยู่หน้าจุดทศนิยมของเลขฐาน 2 ของเรา

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 5.png

ขั้นตอนที่สาม เราจะแปลงตัวเลขหลังจุดทศนิยมเป็นเลขฐาน 2 กัน โดยวิธีการจะมีดังนี้:

  • เอาทศนิยมทั้งหมดมาคูณ 2
  • เก็บค่า 0 หรือ 1 ในตำแหน่งหน้าจุดทศนิยม
  • เอาเลขหลังทศนิยมไปทำข้อ 1 วนซ้ำไปเรื่อยๆ จนกว่าเลขหลังจุดทศนิยมจะเป็น 0.0
CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 6.png

หลังจากทำเสร็จแล้ว เรานำตัวเลขที่เก็บไว้มาต่อกัน จะได้ว่าเลขหลังจุดทศนิยมในฐาน 10 แปลงเป็นเลขฐาน 2 ได้ ทีนี้เรานำเลขหน้าจุดทศนิยมในฐาน 2 มาต่อกับเลขหลังจุดทศนิยมในฐาน 2 เราก็จะได้เลขทศนิยมในรูปเลขฐาน 2 แล้วววว!!

แต่ถ้าหากเลขทศนิยมติดลบ หรือเลขทศนิยมเราอยู่ในรูปของเลขทศนิยมซ้ำ เช่น 0.3 แปลงเป็นเลขฐาน 2 ได้ 0.0100110011... (0011 ซ้ำไปเรื่อยๆ) เราจะทำอย่างไรดี

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 7.png

เฉลยยย เราจะใช้มาตรฐานการเก็บเลขทศนิยมสากลที่ชื่อว่า IEEE754

แล้ว IEEE754 คืออะไร? วันนี้พี่ ๆ จะพาพวกเราไปดูกัน!!


หลักการ IEEE754 คืออะไร?

โดย IEEE754 ถูกสร้างโดยสถาบันวิชาชีพวิศวกรไฟฟ้าและอิเล็กทรอนิกส์เพื่อแก้ปัญหาการเก็บเลขทศนิยมบนคอมพิวเตอร์

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 8.png

เรามาดูหลักการการเก็บเลขทศนิยมของ IEEE754 กันดีกว่า

อย่างแรก เรารู้ว่าตัวเลขฐาน 10 ทุกตัวสามารถเขียนเป็นเลขสัญกรณ์วิทยาศาสตร์ได้แบบนี้

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 9.png

โดยที่สัมประสิทธิ์ (a) จะต้องสอดคล้องกับเงื่อนไขนี้ 1 ≤ |a| < 10 และเลขชี้กำลัง (e) จะต้องเป็นจำนวนเต็ม

เราจะลองเขียนเลขสัญกรณ์วิทยาศาสตร์จากเลขสัญกรณ์วิทยาศาสตร์ฐาน 10 เป็นเลขสัญกรณ์วิทยาศาสตร์ฐาน 2 ซึ่งจะสามารถเขียนได้ตามนี้เลย

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 10.png

โดยเงื่อนไขก็จะเปลี่ยนเล็กน้อย เราจะได้ว่าค่า a จะต้องสอดคล้องกับเงื่อนไข 1 ≤ |a| < 2 และ e ต้องเป็นจำนวนเต็ม


เราลองมาดูค่า a กันดีกว่า โดยค่า a เราสามารถแยกออกได้เป็น 2 อย่างได้แก่ เครื่องหมาย และ ขนาด (sign และ magnitude) โดยสามารถเขียนได้ในรูปแบบนี้

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 14.png

โดยที่ sign เป็นได้แค่ 1 หรือ -1 และ magnitude ไม่สามารถเป็นจำนวนลบได้


แต่เนื่องจากว่า คอมพิวเตอร์เก็บข้อมูลเป็นเลข 0 และ 1 เราจึงสามารถเก็บค่าของ sign ได้อีกแบบ ตามรูปด้านล่าง

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 13.png

เราจะได้ว่า

  • ถ้า sign = 0 ค่าจะเป็น 1
  • ถ้า sign = 1 ค่าจะเป็น -1

สำหรับตัว magnitude เนื่องจากค่า a ของเรามีเลข 1 นำหน้าเสมอ แล้วตามด้วยเลขหลังจุดทศนิยม เพื่อให้ประหยัดพื้นที่ในการเก็บข้อมูล IEEE754 จึงเก็บค่า magnitude แค่เพียงตัวเลขหลังทศนิยม โดยเราเรียกตัวนั้นว่า fraction ตามรูปด้านล่างเลย

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 17.png

ซึ่งเมื่อรวมกับสมการ a = sign x magnitude เราจะได้ว่า

CodeQuiz EP.23 คอมเก็บเลขทศนิยมยังไง_18.png

เรามาดูเลขชี้กำลัง (e) ดีกว่า

เนื่องจากเลขชี้กำลังของเราสามารถเป็นจำนวนเต็มลบได้ แต่เราเก็บเลขบวกง่ายกว่า IEEE754 จึงเก็บตัวเลข e เป็นจำนวนเต็มบวก แล้วลบด้วยค่าความโน้มเอียง (bias) เพื่อให้สามารถเก็บเลขชี้กำลังเป็นลบได้ เช่น ถ้าหากเราเก็บเลขนี้ใน 32 bits เราจะใช้ bias = 127

เราจะได้รูปเต็มของเลขสัญกรณ์วิทยาศาสตร์ฐาน 2 ที่ IEEE754 ใช้ได้ ตามรูปนี้เลย

CodeQuiz EP.23 คอมเก็บทศนิยมยังไง_ 16.png

ถ้าหากเรามีพื้นที่เก็บ 32 บิต เราจะเก็บเลขทศนิยมของเราดังนี้

CodeQuiz EP.23 คอมเก็บเลขทศนิยมยังไง_17.png

มาดูตัวอย่างกันดีกว่า

ถ้าหากเราจะเก็บเลข 0.15625 ในรูปแบบ IEEE754 เราเริ่มจากการดูว่าตัวเลขนี้เป็นลบไหม เนื่องจาก 0.15625 เป็นบวก เราจะได้ว่า เลขด้านหน้าสุดคือ 0

หลังจากเราลองเขียน 0.15625 ในเลขฐาน 2 ด้วยวิธีที่เราเคยทำ จะได้ว่า 0.15625 = 0.00101

หลังจากนั้นเรานับว่า เราต้องขยับจุดทศนิยมไปทางซ้ายกี่รอบถึงจะได้เลขหน้าทศนิยมเป็น 1 ซึ่งในกรณนีนี้เราต้องขยับ -3 รอบ (เราขยับด้านขวา เราจะนับเป็นลบ) เราจะได้ตัวเลขหลังจุดทศนิยมในฐาน 2 เป็น 01000... ซึ่งคือค่า fraction ของเรานั่นเอง และจะได้อีกว่า e - bias = -3 เพราะเราขยับจุดทศนิยม 3 รอบไปทางด้านขวา และเรารู้ว่า bias ในกรณีของเราคือ 127 เราจะได้ว่า e ของเราคือ 124 หรือในฐาน 2 ก็คือ 01111100

เราเลยได้ว่า 0.15625 เขียนในรูป IEEE754 32 bits ได้เป็น 0 01111100 01000000000000000000000 นั่นเอง!!


ข้อดีและข้อเสียของ IEEE754 มีอะไรบ้าง?

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

แต่ข้อเสียก็คือ ค่าบางค่าจะไม่แม่นยำ 100% เมื่อเก็บในรูปแบบ IEEE754 เพราะตัวเลขทศนิยมยาวเกินไป หรือตัวเลขนั้นไม่สามารถเขียนในรูปเลขฐาน 2 โดยใช้จำนวนตัวเลขทศนิยมที่จำกัดได้ เช่น 0.3 0.4 0.6

ซึ่งเราสามารถเพิ่มความละเอียดและความกว้างของช่วงที่เก็บได้จากการเพิ่มจำนวนบิตที่เราเก็บข้อมูล

32 bits จะเรียก single presicion

64 bits จะเรียก double presicion

แต่โดยปกติแล้ว double presicion ก็เพียงพอสำหรับการคำนวณในคอมพิวเตอร์ทั่วไปแล้ว

จบกันไปแล้วกับหลักการ IEEE754 ต่อไปพี่ ๆ จะนำความรู้เรื่องอะไรมาให้น้องได้อ่านอีก รอติดตามชมกันได้เลยที่เว็บไซต์ Leagues of Code TH แล้วพบกันใหม่ สำหรับวันนี้ก็ บ๊ายบายจ้าาา

บทความที่เกี่ยวข้อง