前言
看了点博客, 浮点型数据的存储方式基本了解了, 感觉还是要详细打印出来才能彻底理解, 这里简单的打印所有可能的浮点模式, 帮助理解
例程
#include <stdio.h>
void displayBits32(unsigned value) {
unsigned c;
unsigned displayMask = 1 << 31;
for(c=1;c<=32;c++) {
if(c == 1) {
printf(" S=");
}
else if(c == 2) {
printf(" E=");
}
else if(c == 10) {
printf(" M=1."); // M里开头的1是不会存储的, 这里补上
}
putchar(value & displayMask ? '1' : '0');
value <<= 1;
}
}
int main(int argc, char **argv)
{
float f = 5.999999;
unsigned *a = (unsigned *)&f;
f= 5.000000;
displayBits32(*a); printf(" %f\n", f);
f= 5.000001;
displayBits32(*a); printf(" %f\n", f);
f= 5.000002;
displayBits32(*a); printf(" %f\n", f);
f= 5.000003;
displayBits32(*a); printf(" %f\n", f);
f= 5.000004;
displayBits32(*a); printf(" %f\n", f);
f= 5.000005;
displayBits32(*a); printf(" %f\n", f);
f= 5.000006;
displayBits32(*a); printf(" %f\n", f);
f= 5.000007;
displayBits32(*a); printf(" %f\n", f);
f= 5.000008;
displayBits32(*a); printf(" %f\n", f);
f= 5.000009;
displayBits32(*a); printf(" %f\n", f);
f= 5.000010;
displayBits32(*a); printf(" %f\n", f);
putchar('\n');
f= 5.999990;
displayBits32(*a); printf(" %f\n", f);
f= 5.999991;
displayBits32(*a); printf(" %f\n", f);
f= 5.999992;
displayBits32(*a); printf(" %f\n", f);
f= 5.999993;
displayBits32(*a); printf(" %f\n", f);
f= 5.999994;
displayBits32(*a); printf(" %f\n", f);
f= 5.999995;
displayBits32(*a); printf(" %f\n", f);
f= 5.999996;
displayBits32(*a); printf(" %f\n", f);
f= 5.999997;
displayBits32(*a); printf(" %f\n", f);
f= 5.999998;
displayBits32(*a); printf(" %f\n", f);
f= 5.999999;
displayBits32(*a); printf(" %f\n", f);
putchar('\n');
f= -5.000000;
displayBits32(*a); printf(" %f\n", f);
f= -5.000001;
displayBits32(*a); printf(" %f\n", f);
f= -5.000002;
displayBits32(*a); printf(" %f\n", f);
f= -5.000003;
displayBits32(*a); printf(" %f\n", f);
f= -5.000004;
displayBits32(*a); printf(" %f\n", f);
f= -5.000005;
displayBits32(*a); printf(" %f\n", f);
f= -5.000006;
displayBits32(*a); printf(" %f\n", f);
f= -5.000007;
displayBits32(*a); printf(" %f\n", f);
f= -5.000008;
displayBits32(*a); printf(" %f\n", f);
f= -5.000009;
displayBits32(*a); printf(" %f\n", f);
f= -5.000010;
displayBits32(*a); printf(" %f\n", f);
putchar('\n');
f= -5.999990;
displayBits32(*a); printf(" %f\n", f);
f= -5.999991;
displayBits32(*a); printf(" %f\n", f);
f= -5.999992;
displayBits32(*a); printf(" %f\n", f);
f= -5.999993;
displayBits32(*a); printf(" %f\n", f);
f= -5.999994;
displayBits32(*a); printf(" %f\n", f);
f= -5.999995;
displayBits32(*a); printf(" %f\n", f);
f= -5.999996;
displayBits32(*a); printf(" %f\n", f);
f= -5.999997;
displayBits32(*a); printf(" %f\n", f);
f= -5.999998;
displayBits32(*a); printf(" %f\n", f);
f= -5.999999;
displayBits32(*a); printf(" %f\n", f);
putchar('\n');
f= 0.000000;
displayBits32(*a); printf(" %f\n", f);
f= 0.000001;
displayBits32(*a); printf(" %f\n", f);
f= 0.000002;
displayBits32(*a); printf(" %f\n", f);
f= 0.000003;
displayBits32(*a); printf(" %f\n", f);
f= 0.000004;
displayBits32(*a); printf(" %f\n", f);
f= 0.000005;
displayBits32(*a); printf(" %f\n", f);
f= 0.000006;
displayBits32(*a); printf(" %f\n", f);
f= 0.000007;
displayBits32(*a); printf(" %f\n", f);
f= 0.000008;
displayBits32(*a); printf(" %f\n", f);
f= 0.000009;
displayBits32(*a); printf(" %f\n", f);
f= 0.000010;
displayBits32(*a); printf(" %f\n", f);
putchar('\n');
f= 0.999990;
displayBits32(*a); printf(" %f\n", f);
f= 0.999991;
displayBits32(*a); printf(" %f\n", f);
f= 0.999992;
displayBits32(*a); printf(" %f\n", f);
f= 0.999993;
displayBits32(*a); printf(" %f\n", f);
f= 0.999994;
displayBits32(*a); printf(" %f\n", f);
f= 0.999995;
displayBits32(*a); printf(" %f\n", f);
f= 0.999996;
displayBits32(*a); printf(" %f\n", f);
f= 0.999997;
displayBits32(*a); printf(" %f\n", f);
f= 0.999998;
displayBits32(*a); printf(" %f\n", f);
f= 0.999999;
displayBits32(*a); printf(" %f\n", f);
putchar('\n');
f= -0.000000;
displayBits32(*a); printf(" %f\n", f);
f= -0.000001;
displayBits32(*a); printf(" %f\n", f);
f= -0.000002;
displayBits32(*a); printf(" %f\n", f);
f= -0.000003;
displayBits32(*a); printf(" %f\n", f);
f= -0.000004;
displayBits32(*a); printf(" %f\n", f);
f= -0.000005;
displayBits32(*a); printf(" %f\n", f);
f= -0.000006;
displayBits32(*a); printf(" %f\n", f);
f= -0.000007;
displayBits32(*a); printf(" %f\n", f);
f= -0.000008;
displayBits32(*a); printf(" %f\n", f);
f= -0.000009;
displayBits32(*a); printf(" %f\n", f);
f= -0.000010;
displayBits32(*a); printf(" %f\n", f);
putchar('\n');
f= -0.999990;
displayBits32(*a); printf(" %f\n", f);
f= -0.999991;
displayBits32(*a); printf(" %f\n", f);
f= -0.999992;
displayBits32(*a); printf(" %f\n", f);
f= -0.999993;
displayBits32(*a); printf(" %f\n", f);
f= -0.999994;
displayBits32(*a); printf(" %f\n", f);
f= -0.999995;
displayBits32(*a); printf(" %f\n", f);
f= -0.999996;
displayBits32(*a); printf(" %f\n", f);
f= -0.999997;
displayBits32(*a); printf(" %f\n", f);
f= -0.999998;
displayBits32(*a); printf(" %f\n", f);
f= -0.999999;
displayBits32(*a); printf(" %f\n", f);
return 0;
}
运行结果和说明
S=0 E=10000001 M=1.01000000000000000000000 5.000000 // S=0 表示正数
S=0 E=10000001 M=1.01000000000000000000010 5.000001 // E 要减去127表示指数 这里是 E=2
S=0 E=10000001 M=1.01000000000000000000100 5.000002 // M 表示值 1.01 指数 2 就是5 小数位看规律也很好理解, 似乎多了一位
S=0 E=10000001 M=1.01000000000000000000110 5.000003
S=0 E=10000001 M=1.01000000000000000001000 5.000004
S=0 E=10000001 M=1.01000000000000000001010 5.000005
S=0 E=10000001 M=1.01000000000000000001101 5.000006
S=0 E=10000001 M=1.01000000000000000001111 5.000007
S=0 E=10000001 M=1.01000000000000000010001 5.000008
S=0 E=10000001 M=1.01000000000000000010011 5.000009
S=0 E=10000001 M=1.01000000000000000010101 5.000010
S=0 E=10000001 M=1.01111111111111111101011 5.999990
S=0 E=10000001 M=1.01111111111111111101101 5.999991
S=0 E=10000001 M=1.01111111111111111101111 5.999992
S=0 E=10000001 M=1.01111111111111111110001 5.999993
S=0 E=10000001 M=1.01111111111111111110011 5.999994
S=0 E=10000001 M=1.01111111111111111110110 5.999995
S=0 E=10000001 M=1.01111111111111111111000 5.999996
S=0 E=10000001 M=1.01111111111111111111010 5.999997
S=0 E=10000001 M=1.01111111111111111111100 5.999998
S=0 E=10000001 M=1.01111111111111111111110 5.999999
S=1 E=10000001 M=1.01000000000000000000000 -5.000000 // S=1 表示负数
S=1 E=10000001 M=1.01000000000000000000010 -5.000001
S=1 E=10000001 M=1.01000000000000000000100 -5.000002
S=1 E=10000001 M=1.01000000000000000000110 -5.000003
S=1 E=10000001 M=1.01000000000000000001000 -5.000004
S=1 E=10000001 M=1.01000000000000000001010 -5.000005
S=1 E=10000001 M=1.01000000000000000001101 -5.000006
S=1 E=10000001 M=1.01000000000000000001111 -5.000007
S=1 E=10000001 M=1.01000000000000000010001 -5.000008
S=1 E=10000001 M=1.01000000000000000010011 -5.000009
S=1 E=10000001 M=1.01000000000000000010101 -5.000010
S=1 E=10000001 M=1.01111111111111111101011 -5.999990
S=1 E=10000001 M=1.01111111111111111101101 -5.999991
S=1 E=10000001 M=1.01111111111111111101111 -5.999992
S=1 E=10000001 M=1.01111111111111111110001 -5.999993
S=1 E=10000001 M=1.01111111111111111110011 -5.999994
S=1 E=10000001 M=1.01111111111111111110110 -5.999995
S=1 E=10000001 M=1.01111111111111111111000 -5.999996
S=1 E=10000001 M=1.01111111111111111111010 -5.999997
S=1 E=10000001 M=1.01111111111111111111100 -5.999998
S=1 E=10000001 M=1.01111111111111111111110 -5.999999
S=0 E=00000000 M=1.00000000000000000000000 0.000000
S=0 E=01101011 M=1.00001100011011110111101 0.000001 // E = -20, M 里 1. 后面的舍去
S=0 E=01101100 M=1.00001100011011110111101 0.000002 // E = -19, M 里 1.0 右面的舍去
S=0 E=01101100 M=1.10010010101001110011100 0.000003 // E = -19, M 里 1.1 右面的舍去
S=0 E=01101101 M=1.00001100011011110111101 0.000004
S=0 E=01101101 M=1.01001111100010110101100 0.000005
S=0 E=01101101 M=1.10010010101001110011100 0.000006
S=0 E=01101101 M=1.11010101110000110001011 0.000007
S=0 E=01101110 M=1.00001100011011110111101 0.000008
S=0 E=01101110 M=1.00101101111111010110101 0.000009
S=0 E=01101110 M=1.01001111100010110101100 0.000010
S=0 E=01111110 M=1.11111111111111101011000 0.999990
S=0 E=01111110 M=1.11111111111111101101001 0.999991
S=0 E=01111110 M=1.11111111111111101111010 0.999992
S=0 E=01111110 M=1.11111111111111110001011 0.999993
S=0 E=01111110 M=1.11111111111111110011011 0.999994
S=0 E=01111110 M=1.11111111111111110101100 0.999995
S=0 E=01111110 M=1.11111111111111110111101 0.999996
S=0 E=01111110 M=1.11111111111111111001110 0.999997
S=0 E=01111110 M=1.11111111111111111011110 0.999998
S=0 E=01111110 M=1.11111111111111111101111 0.999999
S=1 E=00000000 M=1.00000000000000000000000 -0.000000
S=1 E=01101011 M=1.00001100011011110111101 -0.000001 // 同上
S=1 E=01101100 M=1.00001100011011110111101 -0.000002
S=1 E=01101100 M=1.10010010101001110011100 -0.000003
S=1 E=01101101 M=1.00001100011011110111101 -0.000004
S=1 E=01101101 M=1.01001111100010110101100 -0.000005
S=1 E=01101101 M=1.10010010101001110011100 -0.000006
S=1 E=01101101 M=1.11010101110000110001011 -0.000007
S=1 E=01101110 M=1.00001100011011110111101 -0.000008
S=1 E=01101110 M=1.00101101111111010110101 -0.000009
S=1 E=01101110 M=1.01001111100010110101100 -0.000010
S=1 E=01111110 M=1.11111111111111101011000 -0.999990
S=1 E=01111110 M=1.11111111111111101101001 -0.999991
S=1 E=01111110 M=1.11111111111111101111010 -0.999992
S=1 E=01111110 M=1.11111111111111110001011 -0.999993
S=1 E=01111110 M=1.11111111111111110011011 -0.999994
S=1 E=01111110 M=1.11111111111111110101100 -0.999995
S=1 E=01111110 M=1.11111111111111110111101 -0.999996
S=1 E=01111110 M=1.11111111111111111001110 -0.999997
S=1 E=01111110 M=1.11111111111111111011110 -0.999998
S=1 E=01111110 M=1.11111111111111111101111 -0.999999