วันเสาร์ที่ 25 มกราคม พ.ศ. 2557

Floating Point Number

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 ได้



ไม่มีความคิดเห็น:

แสดงความคิดเห็น