ว่าด้วยเรื่องจำนวนและตัวเลข 2 นะครับ

เก็บข้อมูลตัวแปร float จาก GNU Compiler Collection (GCC) รันบน 32bit Ubuntu based on IEEE 754

0.05;                0-01111010-10011001 10011001 1001101
0.005;              0-01110111-01000111 10101110 0001010
-20.812;           1-10000011-01001100 11111101 1111010
20.1234567;     0-10000011-01000001 11111001 1010111
20.12345678;    0-10000011-01000001 11111001 1010111
1.0;                  0-01111111-00000000 00000000 0000000
2.0;                  0-10000000-00000000 00000000 0000000
10.0;                0-10000010-01000000 00000000 0000000
0.1;                  0-01111011-10011001 10011001 1001101
0.2;                  0-01111100-10011001 10011001 1001101
0.01;                0-01111000-01000111 10101110 0001010
0.02;                0-01111001-01000111 10101110 0001010
1.01;                0-01111111-00000010 10001111 0101110
1.02;                0-01111111-00000101 00011110 1011100
10.1;                0-10000010-01000011 00110011 0011010
10.2;                0-10000010-01000110 01100110 0110011

Type Sign Exponent Exponent  bias significand total
Half (IEEE 754r) 1 5 15 10 16
Single 1 8 127 23 32
Double 1 11 1023 52 64
Quad 1 15 16383 112 128

ตารางจาก http://en.wikipedia.org/wiki/Floating_point

Floating-Point Representation

ตัวแปร float มีขนาด 4 ไบต์ หรือ 32 บิตจะแบ่งพื้นที่เพื่อเก็บข้อมูลแบบ ทศนิยมดังนี้

\framebox[0.4in]{S} \framebox[0.8in]{E} \framebox[2in]{M}

S : Sing(1 บิต) เอาไว้เพื่่อบอกว่า ทศนิยมนั้นเป็นเลข ลบ หรือ บวก โดย บิต 0 คือ + , บิต 1 คือ -

E : Exponent(8 บิต) เป็นส่วนที่แสดง เลขยกกำลังเป็นได้ทั้งบวก และ ลบ

M : Mantissa(23 บิต) เป็นส่วนที่อยู่หลังจุดทศนิยม

วิธีการเปลี่ยน ทศนิยม(float) ให้เป็นเลขฐานสอง

1. นำเลขที่ต้องการจะเปลี่ยนมาแปลงเป็นเลขฐานสอง

เช่น 0.00510 = 0.0000000101000111101011100001010001111010111000010100011110112

(วิธีการแปลงนั้น ขอยกเป็นบทความถัดไปนะครับ)

2. ทำ Normalization form (คือการทำให้อยู่ในรูป 1.AAA x 2B)

จาก  0.00510 = 0.0000000101000111101011100001010001111010111000010100011110112

ทำเป็น  Normalization form ได้

1.0100011110101110000101000111101011100001010001111011 x 2-8

3. เลข Mantissa คือ เลขฐานสองที่อยู่หลังจุดทศนิยม

จาก  1.0100011110101110000101000111101011100001010001111011 x 2-8

Mantissa คือ  0100011110101110000101000111101011100001010001111011

แบ่งเป็น 8 bits ให้สวยงาม ก็จะได้

01000111 10101110 00010100 0111101011100001010001111011

Mantissa มีขนาด 23 บิต เพราะฉะนั้น เราสนใจเพียง 24 บิตแรกเท่านั้น

ที่สนใจ 24 บิต ไม่ใช่ 23 บิต ก็เพราะว่า บิตตัวที่ 24 ถ้าเป็นบิต 1 ก็จะปัดขึ้นมา แต่ถ้าเป็นบิต 0 ก็ไม่ปัดนั่นเอง

(วิธีปัดนั้น ก็เหมือนกับการ บวกด้วย 1 แบบเลขฐานสองครับ)

เพราะฉะนั้น

Mantissa = 01000111 10101110 0001010

4. เลข Exponent คือเลขกำลัง

จาก 1.0100011110101110000101000111101011100001010001111011 x 2-8

Exponent หาได้จาก bias – true exponent

bias ของ float = 127

true exponent คือ -8 (เลขกำลัง ของ 2 นั่นเอง)

เพราะฉะนั้น จะได้

Exponent = 12710 + (-8)10 = 11910 ซึ่งเท่ากับ 11101112 และเนื่องจาก Exponent มีขนาด 8 บิต

แต่ Exponent ที่เราคำนวนได้นั้น มีเพียง 7 บิต แก้โดยการเติม บิต 0 ไปข้างหน้า จนครบ 8 บิต ดังนั้น

จะได้

Exponent = 01110111

5. รวม sign, exponent, mantissa เข้าด้วยกัน

sign เป็น 0 เพราะ 0.005 เป็น บวก

exponent เป็น  01110111

mantissa เป็น  01000111 10101110 0001010

รวมกันจะได้  0 01110111 01000111 10101110 0001010

อ้างอิงความรู้จาก

www.cs.northwestern.edu/~fabianb/classes/eecs-213-s07/lectures/04-FloatingPoint.pps

http://www.cs.northwestern.edu/~fabianb/classes/

Last 5 posts by mishell