Chinaunix首页 | 论坛 | 博客
  • 博客访问: 740997
  • 博文数量: 251
  • 博客积分: 10367
  • 博客等级: 上将
  • 技术积分: 2750
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-10 14:43
文章分类

全部博文(251)

文章存档

2009年(2)

2008年(86)

2007年(163)

分类: C/C++

2008-06-15 10:51:38

主要讲单精度,双精度类似。
 
先看一个程序:
 
 

#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int

void ftoc(float a)
{
// float a;


     uchar i,*px;

     uchar x[4]; /*定义字符数组,准备存储浮点数的四个字节*/

     void *pf;

     px=x; /*px指针指向数组x*/

     pf=&a; /*void 型指针指向浮点数首地址*/

// a=34.526;


     for(i=0;i<4;i++)
     {
                     *(px+i)=*((char *)pf+i); /*强制void 型指针转成char型,因为*/
                     printf("%d: %d \n",i,(int)(*(px+i)));
     } /*void型指针不能运算*/

}

int main()
{
    float a;
    
    while(1)
    {
            puts("input:");
            scanf("%f",&a);
            ftoc(a);
    }
    
    getchar();
    
    return 0;
}

运行如下:

解释如下:

浮点数的存储格式:

浮点数的存储格式是符号+阶码(定点整数)+尾数(定点小数)
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM
即1位符号位(0为正,1为负),8位指数位,23位尾数位
浮点数存储前先转化成2的k次方形式,即:
f = A1*2^k + A2*2^(k-1) + ... + Ak +... +An*2^(-m) (Ai = {0, 1}, A1 = 1)
如5.5=2^2 + 2^0 + 2^(-1)
其中的k就是指数,加127后组成8位指数位
5.5的指数位就是2+127 = 129 = 10000001   (本来是128,为了方便,IEEE规定为127,双精度为1023,我查资料后得出的结论,不知道对不对。
A2A3.....An就是尾数位,不足23位后补0
所以5.5 = 01000000101000000000000000000000 = 40A00000
所以,对浮点数*2、/2只要对8位符号位+、- 即可,但不是左移、右移

《深入理解计算机系统》第二章中的浮点数存储问题,下面就列一个小事例。

 

更多请看:

http://blog.chinaunix.net/u/19782/showart_229061.html

http://www.mcu123.com/new/Article_Show.asp?ArticleID=10

http://blog.csdn.net/dreamXren/archive/2005/11/25/536902.aspx

阅读(1058) | 评论(0) | 转发(0) |
0

上一篇:sed 用法介绍

下一篇:代码收藏

给主人留下些什么吧!~~