程序中进行确认

程序中进行确认,读到这里,有人额角冒汗吗?上述内容不是仅仅读一遍就能马上理解的,最好能够在实际的程序中加以确认。因此,我们准备了一个试验用的程序,如代码清单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 用单精度浮点数表示的数据

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!