浮点数

原创 2013年12月02日 19:28:44
1. 浮点数据在内存的表示形式
     在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。
          对于float型数据,其二进制有32位,其中符号位1位,阶码8位,尾数23位;
          对于double型数据,其二进制为64位,符号位1位,阶码11位,尾数52位。

                31        30-23       22-0

float       符号位     阶码        尾数

                63        62-52       51-0

double    符号位     阶码        尾数

符号位:0表示正,1表示负
      阶码:这里阶码采用移码表示,对于float型数据其规定偏置量为127,阶码有正有负,对于8位二进制,则其表示范围为 -128-127,double型规定为1023,其表示范围为-1024-1023。比如对于float型数据,若阶码的真实值为2,则加上127后为 129,其阶码表示形式为10000010
参考文献:www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html


2. 浮点数字节大小
     sizeof(double) = 8;
     sizeof(float) = 4;

3. 强制转换:float->double; double->float. 它们不是简单的字节截断或扩展,而是根据对方的内存存储形式进行转化。举例如下, 更详细的举例请参见附录测试程序。
     double  da=3,da1;       // da在内存的形式为: 0x40 08 00 00 00 00 00 00 
     float  fa= 3,fa1;        //  fa在内存的形式为: 0x40 40 00 00
     da1 =(double) fa;      //  float->double得到da1: 为0x40 08 00 00 00 00 00 00 
     fa1 = (float) da;          //  double->float得到da2: 为0x40 40 00 00

4. printf 和 scanf 对浮点数据的操作。

          读取float数据:scanf("%f", &fa); 接收一个float型数据,并且存放在以&fa为起始地址的4个字节内存中,不管fa是什么类型。
          读取double数据:scanf("%lf",&db);接受一个double型数据,并且存放在以&db起始地址的8个字节内存里,不管db是什么类型。
          输出double/float数据都为:printf("%f,%f",&fa,&db);在printf内部都自动转换为double类型。
    

附录:测试程序
#in clude <stdio.h>
#include <string.h>

typedef union
{
        double n;
        float y;
        unsigned char c[8];
}uni_u;

int main()
{
        int i=0;
        double d=0;
        uni_u aa={.n=0},bb={.n=0},cc={.n=0};
        printf("please print a float value:");
        scanf("%f",&aa);
        printf("the value in the memory is:\n");
        for(i=0;i<8;i++)
        {
                printf("%x\t",aa.c[i]);
        }
        printf("\n");
        printf("%f\n",aa.n);
        printf("%f\n\n",aa.y);
        d=(double)aa.y;
        memcpy(&aa,&d,8);
        printf("the float to double value:\n");
        for(i=0;i<8;i++)
        {
                printf("%x\t",aa.c[i]);
        }

        printf("\nplease input a double value:");
        scanf("%lf",&bb);
        for(i=0;i<8;i++)
        {
                printf("%x\t",bb.c[i]);
        }
        printf("\n");
        printf("%f\n",bb.n);
        printf("%f\n\n",bb.y);

        float f=(double)bb.n;
        printf("the double to float value:\n");
        memcpy(&bb,&f,8);
        for(i=0;i<8;i++)
        {
                printf("%x\t",bb.c[i]);
        }
}

输出:
please print a float value:3
the value in the memory is:
0    0    40    40    0    0    0    0         //1.说明:float在内存中的形式,只占用了前面4字节
0.000000
3.000000

the float to double value:
0    0    0    0    0    0    8    40           //2. 说明:上述float值转化为double类型,内存情况。
please input a double value:3
0    0    0    0    0    0    8    40           //3. 说明:double类型,内存情况。与上述2值相同。
3.000000
0.000000

the double to float value:
0    0    40    40    0    0    0    0          //4. 说明double值转化为float型,可知内存和上述1值相同。

定点数与浮点数

  • 2015年03月17日 21:12
  • 3.92MB
  • 下载

实现浮点数转换成人民币读法字符串(Java)

public class NumberToRMB {     private final String[] hanArr = {"零", "壹", "贰", "叁", "肆", "伍", "...

实现2个浮点数做除法的ip

  • 2017年11月01日 10:58
  • 14.71MB
  • 下载

浮点数相加ip

  • 2017年11月01日 10:51
  • 8.14MB
  • 下载

基于nodejs实现16进制转浮点数

基于nodejs实现16进制转浮点数最近,在做一个项目时,下位机以modbusRTU的协议,发送到nodejs后台服务器。后台对modbusRTU协议进行解析:但是采集数据后,后台如何将16进制的转换...

浮点数转换为hex字符串

  • 2014年11月12日 14:15
  • 6KB
  • 下载

浮点数的分数表达

  • 2016年01月02日 15:39
  • 1KB
  • 下载

Java string.format 控制整数与浮点数总结

1. 对整数进行格式化:%[index]$[标识][最小宽度]转换方式 标识:   '-' 在最小宽度内左对齐,不可以与“用0填充”同时使用   '#' 只适用于8进制和16进制,8进制...

关于浮点数的精度问题

  • 2013年11月03日 14:30
  • 39KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浮点数
举报原因:
原因补充:

(最多只允许输入30个字)