我们经常听说浮点数,其实浮点数是和定点数对应的。定点数就是小数点固定的数,而且他的小数点在最右边,所以定点数用来表示整数。
浮点数表示方法允许小数点的浮动,一个浮点数分为三个部分:第一部分是符号,可以是正数可以是负数;第二部分是小数点应该左移或右移的位移量;第三部分是小数点位置固定的定点表示法。
下面介绍常用的IEEE标准定义的浮点数的标准。
符号部分: 0表示正数 1表示负数
位移量部分:采用余127码表示。在余码系统中,正数和负数都用无符号数储存,而且可以保持原有的大小关系,只需要将所有的数字整体右移。即该部分看做无符号整数,127表示0 126表示-1 128表示1
尾数部分:是将某数字化为1.xxxxxxx * 2^n的形式后的xxxxxx部分.小数点和其左边的1并不存储。
浮点数的存储步骤:
1. 看符号位
2.将数字转化成二进制
3.将二进制规范化为 1.xxxxxxxx*2^n
4. 将n转化为指数(加上127) 尾数xxxx后面补零
5.写出
下面举几个例子:
5.75的二进制表示
1. 是正数,因此符号位为0
2. 十进制转化二进制 5.75 = 101.11(二进制)
3. 将二进制规范化:101.11 = 1.0111 * 2^2
指数部分为2 尾数部分为0111
4. 根据余127码 指数部分为 2+127 = 129 = 10000001(二进制) 尾数部分后面补零 01110000000000000000000
5. 表示如下
0 10000001 01110000000000000000000
-161.875的二进制表示
1. 符号位为1 (负数)
2.转化为二进制 161.875 = 10100001.111(二进制)
3.二进制规范化: 10100001.111 = 1.0100001111 * 2^7
4.指数部分E = 7+127 = 134 = 10000110(二进制) 尾数部分0100001111
5.表示如下
1 10000110 01000011110000000000000
1 10010100 00000000111000100001111表示为实数
1. 首位为1 是负数
2. 指数部分10010100 = 148 148-127 = 21
3. 尾数去规范化 1.00000000111000100001111
4.二进制为 1.00000000111000100001111 * 2^21
5. 十进制为2104378.75
6.该数字是 -2104378.75
c语言验证
源代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <stdio.h> int main(void) { float fnum = 1; int i; int * p = (int *)&fnum; while (fnum != 0) { printf("input a num: "); scanf("%f", &fnum); for (i = 31; i >= 0; i--) { printf("%d", (*p & (1 << i) ? 1: 0)); } printf("\n"); } return 0; } |