程序中进行确认,读到这里,有人额角冒汗吗?上述内容不是仅仅读一遍就能马上理解的,最好能够在实际的程序中加以确认。因此,我们准备了一个试验用的程序,如代码清单3-2所示。接下来,就让我们一起看一下如何用单精度浮点数来表示十进制数0.75吧。
代码清单3-2 用于确认单精度浮点数表示方法的C语言程序
#include <stdio.h>
#include <string.h>
void main() {
float data;
unsigned long buff;
int i;
char s[34];
//将0.75以单精度浮点数的形式存储在变量date中。
data =(float)0.75;
//把数据复制到4字节长度的整数变量buff中以逐个提取出每一位。
memcpy(&buff, &data, 4);
//逐一提取出每一位
for (i =33; i >=0; i--) {
if(i ==1 || i ==10) {
//加入破折号来区分符号部分、指数部分和尾数部分。
s[i] ='-';
} else {
//为各个字节赋值’0’或者’1'。
if (buff % 2 ==1) {
s[i] ='1';
} else {
s[i] ='0';
}
buff /=2;
}
}
s[34] ='\0';
//显示结果。
printf("%s\n", s);
}
该程序执行后,十进制数0.75用单精度浮点数来表示就变成了0-01111110-10000000000000000000000(图3-7)。加入破折号(-)是为了区分符号部分、指数部分、尾数部分。这里,符号部分为0,指数部分为01111110,尾数部分为10000000000000000000000。因为0.75是正数,所以符号位是0。指数部分的01111110是十进制数126,用EXCESS系统表现就是- 1(126- 127=- 1)。根据正则表达式的规则,小数点前面的第1位是1,因此尾数部分10000000000000000000000实际上表示的是1.10000000000000000000000这个二进制数。将尾数部分的二进制数转换成十进制数,结果就是(1 × 2的0次幂)+(1 × 2的-1次幂)=1.5。因此,0-01111110-10000000000000000000000这个单精度浮点数,表示的就是“+ 1.5 × 2的-1次幂”。2的-1次幂是0.5, + 1.5 × 0.5=+ 0.75。正好吻合,结果正确。
图3-7 代码清单3-2的运行结果
接下来,我们继续使用该程序来看一下如何用单精度浮点数表示十进制数0.1。运行后就会发现结果为0-01111011-10011001100110011001101 (只需将data=(float)0.75;的部分变成data=(float)0.1;即可)。这时,如果反过来计算一下这个数值的十进制数,估计大家又要冒汗了,结果居然不是0.1。
图3-8 用单精度浮点数表示的数据
酷客网相关文章:
评论前必须登录!
注册