Floating
Point Number
เนื่องจากการแปลงจำนวนจริงฐานสิบเป็นจำนวนจริงฐานสองส่วนใหญ่ให้ผลลัพธเป็นจำนวนจริงฐานสองที่มีตัวเลขหลังจุดทวินิยมไม่รู้จบ
การตัดสินใจว่าจะใช้จำนวนตัวเลขหลังจุดทวินิยมเป็นจำนวนกี่หลัก
ขึ้นอยู่กับความแม่นยำของค่าที่ต้องการคำนวณ ซึ่งมีความแตกต่างกันออกไปในแต่ละงาน
ดังนั้นในกรณีที่เป็นจำนวนจริงไม่รู้จบ
ผู้ใช้จึงควรเป็นผู้กำหนดความแม่นยำตามต้องการ
การจัดเก็บจำนวนจริงฐานสองรูปแบบที่เหมาะสมกับการทำงานของระบบคอมพิวเตอร์เป็นเลขฐานสองในระบบ
Floating
Point Number ซึ่งมีความต้องการดังนี้
- เก็บค่าของจำนวนจริงให้ได้ความแม่นยำมากที่สุด
-
ใช้จำนวนบิตให้น้อยที่สุดเท่าที่เป็นไปได้
ความยากของปัญหานี้อยู่ที่การใช้จำนวนบิตที่น้อยที่สุด
การแก้ปัญหาที่ง่ายที่สุดคือการเลียนแบบตัวเลขแบบวิทยาศาสตร์ (Scientific
Notation) ซึ่งออกแบบมาสำหรับใช้แสดงค่าจำนวนจริงฐานสิบที่มีค่าสูงมากและต่ำมาก
เช่น ความเร็วของแสงมีค่าเป็น 300,000,000 เมตร/วินาที หรือ
3.0 ´ 108 อนุภาคของฝุ่นมีมวล 0.000 000 000 753 กิโลกรัม หรือ 7.53 ´ 10-10 เป็นต้น
จำนวนจริง
123,000,000,000
เขียนเป็นตัวเลขแบบวิทยาศาสตร์ได้เป็น
1.23 ´ 1011
ค่า
1.23 เรียกว่า สัมประสิทธิ์ (coefficient) ซึ่งกำหนดให้มีค่า 1 £
c <
10 ส่วน 1011 นั้น 10
เป็นฐานของตัวเลข (base หรือ radix) และ
11 เป็นกำลัง (power หรือ exponent) รูปแบบตามข้อกำหนดนี้เรียกว่า
Normal
Form
ในระบบคอมพิวเตอร์มีระบบสำหรับแสดงผลตัวเลขแบบวิทยาศาสตร์
เช่น 123,000,000,000 แสดงผลเป็น 1.23E+11 (1.23 ´ 1011)
และ 0.000001 แสดงผลเป็น 1.0E-6
(1.0 ´ 10-6)
จำนวนจริงฐานสอง
เช่น 11.001012
เขียนในลักษณะเดียวกับตัวเลขแบบวิทยาศาสตร์ และกำหนดให้มีรูปมาตรฐาน
(Normal form) คือ จำนวนเต็มหน้าจุดทวินิยมต้องมีค่าเป็น 0
และจำนวนเต็มตัวเลขหลังจุดทวินิยมต้องมีค่าเป็น 1 เช่น
11.001012 = 0.1100101 ´
22
0.0001012 =
0.101 ´ 2-2
เนื่องจากฐานมีค่าเป็น
2 เสมอ ดังนั้นข้อมูลที่จำเป็นต้องเก็บไว้ จึงมีเฉพาะ 0.1100101
ซึ่งกำหนดให้เรียกว่า significand
และ 2 ซึ่งเป็นกำลัง (exponent) เท่านั้น
และเนื่องด้วยจำนวนจริงมีทั้งจำนวนบวกและจำนวนลบ
จึงต้องเก็บเครื่องหมายของจำนวนโดยใช้บิตเครื่องหมาย (sign bit) จำนวน 1 บิต และกำหนดให้ค่าของบิตที่เป็น 0 แทนจำนวนบวก
และค่าของบิตที่เป็น 1 แทนจำนวนลบ นอกจากนี้แล้ว “กำลัง” เป็นจำนวนเต็มที่มีค่าไม่มากนัก และเป็นได้ทั้งจำนวนลบและบวก
และการคำนวณที่เกี่ยวข้องกับตัวเลขยกกำลังต้องมีการปรับกำลัง
และในการเปรียบเทียบค่าต้องมีการเปรียบเทียบกำลังด้วย
จำนวนเต็มที่มีเครื่องหมายในระบบ 2’s complement ไม่เหมาะสมสำหรับกรณีนี้
จึงต้องมีวิธีในการแทนจำนวนเต็มชนิดมีเครื่องหมายของกำลังที่เหมาะสม
ระบบนี้เรียกว่าระบบเกิน n (Excess–n Notation)
จำนวนเต็มที่ใช้แทนกำลังในระบบ
Excess–n
Notation
ระบบ Excess-n (ระบบที่มีค่าเกิน n) เป็นระบบเลขฐานสองที่ใช้แทนจำนวนเต็มที่มีเครื่องหมายเพื่อความสะดวกในการเปรียบเทียบค่าและการดำเนินการทางคณิตศาสตร์
เนื่องจากเป็นจำนวนเต็มที่มีเครื่องหมาย
ดังนั้นจึงต้องรู้จำนวนบิตที่ใช้ในการแทนค่า
เพื่อจะได้สามารถคำนวณพิสัยของค่าที่สามารถทำการแปลงได้ เช่น
หากกำหนดให้จำนวนบิตที่ใช้แทนค่าเป็น 3 บิต (m = 3) พิสัยของค่าคำนวณได้จากสูตร
-2m-1 à 2m-1, หรือ -22 à 22
– 1 = -4 à 3
พิสัยของค่าซึ่งมีทั้งจำนวนบวกและจำนวนลบ
การเปรียบเทียบที่ทำได้สะดวกคือการนำค่าของ bit pattern มาเปรียบเทียบกันในลักษณะเป็นจำนวนเต็มที่ไม่มีเครื่องหมาย
ซึ่งทำได้โดยการยกระดับค่าของตัวเลขขึ้นเพื่อตั้งจุดการทำงานของตัวเลขยกกำลังใหม่
ตัวเลขยกกำลังในระบบนี้จึงมีชื่อเรียกว่า bias exponent
จำนวนเต็มที่ใช้ยกระดับการค่าของกำลังให้เป็นจำนวนบวกทั้งหมดเรียกว่า
n ซึ่งหากกำหนดให้จำนวนบิตที่ใช้แทนกำลัง = m บิต สามารถคำนวณค่า
n ได้จากสูตร n = 2m-1 และในกรณีที่ใช้จำนวนบิตแทนค่า
3 บิต, n มีค่าเป็น 4 ระบบเลขฐานสองที่ใช้แทน เรียกว่า Excess
- 4 หรือระบบเกิน 4 ซึ่งมีความ สัมพันธ์เป็นไปตามตารางดังนี้
จำนวนเต็ม จำนวนเต็มที่มีการ
เลขฐานสองแทนกำลัง
ที่ใช้แทนกำลัง กำหนดจุดทำงานใหม่ ที่ตั้งจุดการทำงานใหม่แล้ว
(exponent) (bias)
(bias exponent)
---------------- ------------------------ ------------------------------
3 3 + 4 = 7 1
1 1
2 2 + 4 = 6 1
1 0
1 1 + 4 = 5 1
0 1
0 0 + 4 = 4 1
0 0
-1
-1 + 4 = 3 0
1 1
-2 -2 + 4 = 2 0
1 0
-3 -3 + 4 = 1 0
0 1
-4 -4 + 4 = 0 0
0 0
---------------- ------------------------ ------------------------------
เลขฐานสองขนาด 3 บิต
ในระบบ Excess - 4
รูปแบบของ
Floating
Point Number
จำนวนจริงตามมาตรฐาน IEEE 754 - Floating
Point Number กำหนดให้มีการจัดเก็บข้อมูล 3 ส่วน
เครื่องหมายของจำนวน 1 บิต โดย 0 แทนจำนวนบวก และ 1 แทนจำนวนลบ, กำลัง (exponent)
เป็นจำนวนเต็มในระบบ Excess-n หรือ bias
exponent, และ สัมประสิทธิ์ โดยเก็บเฉพาะตัวเลขหลังจุด เรียกว่า significand
และกำหนดจำนวนบิตที่ใช้ในการจัดเก็บแต่ละส่วนดังนี้
ชนิด Sign bit Bias exponent Significand
Single
precision (32 บิต)
1 8 23
Double
precision (64 บิต)
1 11 52
ระบบเลขฐานสองที่ใช้แทนกำลังใน
Single
precision (float ในภาษา C) เป็น Excess-128 และ ระบบเลขฐานสองที่ใช้แทนกำลังใน Double
precision (double ในภาษา C) เป็น Excess-1024
เนื่องจากระบบเลขฐานสองที่ใช้แทนจำนวนจริงมีจำนวนบิตมาก
ทำให้ยากต่อการทำความเข้าใจ
ดังนั้นจึงมีการกำหนดรูปแบบที่ง่ายสำหรับการเรียนการสอน เรียกว่า Microfloat ซึ่งมีขนาดเพียง 8 บิต และมีรูปแบบดังนี้
บิตที่ จำนวน ความหมาย
------- ------- --------------------------------------
7 1 บิตเครื่องหมาย
6
– 4 3 bias exponent ในระบบ excess-4
3
– 0 4 significand
การแปลงจำนวนจริงฐานสิบเป็นเลขฐานสองในระบบ
Microfloat
ขั้นตอนวิธี การแปลงจำนวนจริง(ฐานสิบ) เป็นเลขฐานสองในระบบ
Microfloat
ข้อมูลเข้า จำนวนจริงฐานสิบ
ข้อมูลออก เลขฐานสองในระบบ Microfloat ขนาด 8 บิต
begin
เตรียมข้อมูล 1 ไบต์ สำหรับเก็บเลขฐานศองในระบบ Microfloat
if จำนวนจริงฐานสิบ <
0.0 then
บิตเครื่องหมาย
= 0
else
บิตเครื่องหมาย
= 1
end
เก็บบิตเครื่องหมายในบิตที่ 7
แปลงจำนวนจริงฐานสิบเป็นจำนวนจริงฐานสอง
ทำให้จำนวนจริงฐานสองอยู่ในรูป Normal Form
แปลงกำลังเป็นเลขฐานสองในระบบ
Excess-4 เก็บในบิตที่ 6 - 4
นำตัวเลขหลังจุดทวินิยม
4 หลักมาใช้เป็น significand เก็บในบิตที่ 3 – 0
คืนค่าเลขฐานสองในระบบ Microfloat ให้แก่ผู้เรียก
end
การแปลงเลขฐานสองในระบบ
Microfloat
เป็นจำนวนจริงฐานสิบ
ขั้นตอนวิธี การแปลงเลขฐานสองในระบบ Microfloat เป็นจำนวนจริง(ฐานสิบ)
ข้อมูลเข้า เลขฐานสองในระบบ Microfloat ขนาด 8 บิต
ข้อมูลออก จำนวนจริงฐานสิบ
begin
บิตเครื่องหมาย =
บิตที่ 7 ของ Microfloat
bias_exponent = บิตที่
6 – 4 ของ Microfloat
significand = บิตที่ 3
– 0 ของ Microfloat
แปลง bias_exponent
เป็น exponent
เติมจุดทวินิยมหน้า significand
จัด .significand
x 2exponent ให้อยู่ในรูปของจำนวนจริงฐานสองปกติ
แปลงจำนวนจริงฐานสองเป็นจำนวนจริงฐานสิบ
if บิตเครื่องหมาย = 1 then
จำนวนจริง =
จำนวนจริง x -1
end
คืนค่าจำนวนจริงฐานสิบให้แก่ผู้เรียก
end
ปัญหา - จงแปลง
-0.02410 เป็นเลขฐานสองในระบบ Microfloat
จำนวนจริงฐานสิบเป้นจำนวนลบ
บิตเครื่องหมาย =
1
แปลง -0.2410 เป็นจำนวนจริงฐานสอง
» -0.0000012
-0.0000012 = -0.1 x 2-5
เนื่องจากกำลัง (exponent) ที่คำนวณได้มีค่าเป็น -5 ซึ่งไม่อยู่ในพิสัยของ excess-4
ดังนั้น -0.02410
จึงไม่สามารถจัดเก็บในระบบ Microfloat ได้