原创 C语言与单片机-9-数据类型5

2015-11-11 16:41 2524 12 16 分类: MCU/ 嵌入式 文集: C语言

  为了进一步了解浮点数在计算机中的存储方法。我们看看以下代码的运行结果。

#include<stdio.h>

int  main(  )

{

        float x=123.56f;

      printf("x=%f\n",x);

      return 0;

}

 

我们希望输出x=123.56。在VC中我们编译运行该代码输出结果是:

  X=123.559998

     这是为什么?这就牵扯到浮点数的精度问题。我们运行以下代码看看123.56f在计算机中的存储。#include <stdio.h>

int  main(  )

{

    unsigned char *pchar;

    float x=123.56f;

    pchar=&x; 

  printf("*(pchar+0)=0x%x\n",*pchar);

  printf("*(pchar+1)=0x%x\n",*(pchar+1));

    printf("*(pchar+2)=0x%x\n",*(pchar+2));

  printf("*(pchar+3)=0x%x\n",*(pchar+3)); 

  printf("x=%f\n",x);

   return 0;

}

在VC中的运行结果:

           

                     

        我们来分析一下:0x42 0xf7  0x1e  0xb8二进制形式为:

              0100  0010  1111  0111 0001 1110 1011 1000

我们按照IEEE 的内容来分析结果

            0,100  0010 1,111  0111 0001 1110 1011 1000

0,符号位正数

1000 0101, 指数 133-127=6

111  0111 0001 1110 1011 1000尾数。

尾数最高位补1,1. 111  0111 0001 1110 1011 1000。因为指数是6,所以原来数据为

1. 111  0111 0001 1110 1011 1000*2^6=1111  011. 1 0001 1110 1011 1000.

   

                                                                      =123.559998

这是为什么?这就float的精度问题,二进制小数点后权值为:2^(-n).n取值范围是1到23.

  即2^(-1)+2^(-2)+2^(-3)+2^(-4)+.........,也就是0.5+0.25+0.125+0.625+.........

    你可以自己动手计算一下看看24位二进制是否可以正确表达123.56F?那是不行的!

     如果在程序计算中出现问题您要考虑浮点数精度问题。float可以精确到小数点后6位。其实您只要了解float数存储结构。这个也就记住了。

文章评论4条评论)

登录后参与讨论

用户1554614 2015-11-27 11:47

非常荣幸!

用户1842699 2015-11-27 10:50

嗯 明白了 您的每一次更新都会看 比较喜欢!

用户1554614 2015-11-13 09:22

二进制0.10001111010111000=2^(-1)+2^(-5)+2^(-6)+2^(-7)+2^(-8)+2^(-10)+2^(-12)+2^(-13)+2^(-14)=0.559998 手动计算太麻烦,在VC6.0中可以通过已下代码计算 #include #include char a[]="10001111010111000"; void main( ) { unsigned char i; double sum =0.0; printf("sum="); for( i =0 ; i< sizeof(a); i++) { if( a[i] =='1') { sum = sum + pow(2,-(i+1)); printf("+2^(%d)",-(i+1)); } } printf("\n%f\n", sum); } 不知道您明白没,希望对您有所帮助!谢谢您留言

用户1842699 2015-11-12 16:38

1111 011. 1 0001 1110 1011 1000=123.559998,小数点后是怎么计算的呢?谢谢您!
相关推荐阅读
用户1554614 2016-01-26 11:27
C语言与单片机-12-基本运算2
取模运算%,如果您没有写过代码,您对"%"可能不熟悉。A%B得到A除以B的余数。 如果我们检查一个整数X是否可以倍7整除只需检查X%7的值是否为0.                  ...
用户1554614 2015-12-16 17:23
C语言与单片机-12-基本运算2
  取模运算%,如果您没有写过代码,您对"%"可能不熟悉。A%B得到A除以B的余数。 如果我们检查一个整数X是否可以倍7整除只需检查X%7的值是否为0.                ...
用户1554614 2015-11-26 09:10
C语言与单片机-11-基本运算1
   C使用运算符(operator)来代表算数运算。包括=、+、*、、/、%。      赋值运算符“=”:                " ="是赋值运算符。i=2这条很简单语句该怎...
用户1554614 2015-11-16 15:10
C语言与单片机-10-数据类型6
了解float数据类型,我们有必要了解一下double数据类型。double数据类型又称双精度数,占64位。存储结构如下:                            符号位 指数 ...
用户1554614 2015-11-02 15:06
C语言与单片机-8-数据类型4
我们想想浮点数float类型的数据在计算机中是怎样存储的?为了了解这个问题,首先必须知道计算机数据是二进制存储的。其次必须了解float类型数据的存储方式。             float...
我要评论
4
12
关闭 站长推荐上一条 /2 下一条