Proactive Units for Practical Applications
ว่าด้วยเรื่องจำนวนและตัวเลข 2
ว่าด้วยเรื่องจำนวนและตัวเลข 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 บิตจะแบ่งพื้นที่เพื่อเก็บข้อมูลแบบ ทศนิยมดังนี้
![]()
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
- ว่าด้วยเรื่องจำนวนและัตัวเลข 1 - January 7th, 2010
- วิธีการสลับค่าตัวแปร โดยใช้ Bitwise Operation - July 11th, 2009
- การ modulo แบบสวยงาม ในภาษาซี - July 6th, 2009
- How to export file from open office to PDF on UBUNTU platform - July 3rd, 2009
