浮点数机器存储---(内容来之互联网,本人整理,仅供交流)

原创 2006年05月17日 13:47:00

二. 浮点数内存结构

1.实型变量分为两类:单精度型和双精度型

其类型说明符为float 单精度说明符,double 双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4(1.17549)E-383.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-3081.7E+308,可提供16位有效数字。 实型变量声明的格式和书写规则与整型相同。

例如: float x,y; (x,y为单精度实型量) double a,b,c; (a,b,c为双精度实型量)

实型常数不分单、双精度,都按双精度double型处理。


void main(){

float a;

double b;

a=33333.33333;

b=33333.33333333333333;

printf("%f/n%f/n",a,b);

}

此程序说明floatdouble的不同

a ■■■■

b ■■■■■■■■

a<---33333.33333

b<---33333.33333333333;;

显示程序结果

此程序说明floatdouble的不同

float a;

double b;

a=33333.33333;

b=33333.33333333333333;


 从本例可以看出,由于a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之后均为无效数字。b 是双精度型,有效位为十六位。但Turbo C 规定小数后最多保留六位,其余部分四舍五入。

2.目前大多数高级语言(包括C)都按照IEEE-754标准来规定浮点数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11位阶,53位尾数和1位符号位,如下图所示:

根据IEEE的标准,浮点数的定义如下

             符号位      指数位          小数部分      指数偏移量

单精度浮点数 1 [31]    8 [30-23]     23 [22-00]       127

双精度浮点数 1 [63]    11 [62-52]     52 [51-00]       1023


细心的人会发现,单双精度各部分所占字节数量比实际存储格式都多了一位,的确是这样,事实上,尾数部分包括了一位隐藏位,允许只存储23位就可以表示24位尾数,默认的1位是规格化浮点数的第一位,当规格化一个浮点数时,总是调整它使其值大于等于1而小于2,亦即个位总是为1。例如1100B,对其规格化的结果为1.1乘以2的三次方,但个位1并不存储在23位尾数部分内,这个1是默认位

说明:符号位,表述浮点数的正或者负;指数实际也有正负的,但是没有单独的符号位,而是采用了一个偏移来表示。

在计算机的世界里,进位都是二进制的,指数表示的也是2N次幂

这个数据格式当中的,指数是8位,可表达的范围是0255

对应的实际的指数是-127到+128。这里特殊说明,-127和+128这两个数据在IEEE当中是保留的用作多种用途的:-127表示的数字是0,128和其他位数组合表示多种意义,最典型的就是NAN状态

阶以移码的形式存储。对于单精度浮点数,偏移量为1277FH),而双精度的偏移量为10233FFH)。存储浮点数的阶码之前,偏移量要先加到阶码上。前面例子中,阶为2的三次方,在单精度浮点数中,移码后的结果为127+313082H),双精度为1026402H)。

浮点数有两个例外。数0.0存储为全零。无限大数的阶码存储为全1,尾数部分全零。符号位指示正无穷或者负无穷。

可以用一个类来表示:

class FloatType

{

public:

     union {

         DWORD m_dwInt;

         float m_fFloat;

         struct  {

          bool   m_bSign : 1;

          int    m_nExp  : 8;

          int    m_nFra  : 23;

      }

}

下面举几个例子:

单精度浮点数 十进制 规格化 符号 移阶码 尾数

-12 -1.1x2^3 1 10000010 1000000 00000000 00000000

0.25 1.0x2^-2 0 01111101 0000000 00000000 00000000

所有字节在内存中的排列顺序,intelcpulittle endian顺序,motorolacpubig endian顺序排列。

=====================================

比如+178.125把它按照单精度浮点数的格式进行规格化。

首先+178的二进制表示为1011 0010 ;而0.1250.001

那么它就是10110010.001,可以看到它的指数应该是7=0b0111它的移码为10000110,相加之后 应该是 0100 0011 0011 0010 0010 0000 0000 0000

浮点数的存储:将运算的结果(浮点数)存入eeprom中。我们知道,浮点数在c语言中是以IEEE-754格式存储的,一个浮点数占用四个字节,例如浮点数34.526存为(160261066)这四个数(十进制)。要将一个浮点数存入eeprom,实际上就是要存这四个数。那么如何在程序中得到一个浮点数的组成数呢?

浮点数在存储时,是存储连续的字节中的,只要设法找到存储位置,就可以得到这些数了。可以定义一个void的指针,将此指针指向需要存储的浮点数,然后将此指针强制转化为char型,这样,利用指针就可以得到组成该浮点数的各个字节的值了。具体程序如下:


#define uchar  unsigned char

#define uint   unsigned int

void ftoc(void)

{ float a;

uchar i,*px;

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

void *pf;

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

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

a=34.25;

for(i=0;i<4;i++)

  *(px+i)=*((char *)pf+i); /*强制void 型指针转成char,因为void型指针不能运算*/

for(i=0;i<4;i++)

 printf("%x/n",x[i]);

}

如果已将数存入eeprom,要将其取出合并,方法也是一样,可参考下面的程序。

void ctof(void)

{ float a;

uchar i,*px;

uchar x[4]={0xa0,0x1a,0xa,0x42};

void *pf;

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

pf=&a;

for(i=0;i<4;i++)

 *((char *)pf+i)=*(px+i);

 printf("%f/n",a);

}


s 指数 尾数(从高字节到低字节)如:+178.125为:

0x43322000即:0100 0011 0011 0010 0010 0000 0000 0000

本软件仅供学习交流,如作他用所承受的法律责任一概与作者无关(下载使用即代表你同意上述观点)

最新版本:4.0 下载地址:待定 强制更新:真 公告内容: 4.0已经更新.. 新增一键采集多个网站..... 感谢您的支持 提取码:未知...
  • qq_32464973
  • qq_32464973
  • 2017年03月17日 21:26
  • 343

(二)用 svm 识别手写体数字图片

一、解决问题手写体数字识别二、代码分析1、加载数据from sklearn.datasets import load_digits digits = load_digits() digits.data...
  • qq_21046135
  • qq_21046135
  • 2017年09月20日 22:13
  • 175

浮点数和机器精度

在优化代码的过程中再次遇到
  • Kelvin_Yan
  • Kelvin_Yan
  • 2014年10月28日 13:54
  • 1747

c++中浮点数的存储方式

浮点数的存储方式
  • huai1693838234
  • huai1693838234
  • 2015年03月11日 22:05
  • 793

Java 浮点数是如何存储的?

看一个面试题,   考察面试者对浮点数存储格式的理解 : public class Float_Double { public static void main(String[] args) { ...
  • aduovip
  • aduovip
  • 2015年08月17日 18:37
  • 2370

浮点数存储规则

C/C++浮点数在内存中的存储方式        任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel C...
  • WLZ156
  • WLZ156
  • 2015年10月23日 13:07
  • 529

算法竞赛入门经典------浮点数整数在内存中的存储方式

算法竞赛入门经典---浮点数整数在内存中的存储方式 参考文章:http://www.cnblogs.com/zxtp/p/4938742.html 1、数据的存储方式:大端模式和小端模式 ...
  • liyuqian199695
  • liyuqian199695
  • 2017年02月18日 19:10
  • 471

浮点数在计算机中存储的方式

浮点数在计算机中的存储1996年6月4日,欧洲最新的无人驾驶火箭Ariane5初次航行时,发射后仅37秒,火箭偏离了它的飞行路径,解体并且爆炸。火箭上载有价值5亿美元的通信卫星。科学家们进行调查之后,...
  • Move_now
  • Move_now
  • 2016年10月16日 23:45
  • 1003

深入理解计算机系统-之-数值存储(五)--浮点数在内存中的存储方式

前景回顾前面我们了解到依据CPU的端模式的架构不同,数据的存储的字节序也不同 BE big-endian 大端模式,最直观的字节序 地址低位存储值的高位,地址高位存储值的低位 ,数据填写时,不要考...
  • gatieme
  • gatieme
  • 2016年02月21日 17:19
  • 2659

浮点数存储原理

单精度和双精度浮点数数据类型   C、C++中使用到的单精度浮点数(float)类型和双精度浮点数(double)类型是在IEEE二进制浮点数算术标准(ANSI/IEEE Std 75...
  • cy_weiyi
  • cy_weiyi
  • 2015年08月01日 12:38
  • 504
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浮点数机器存储---(内容来之互联网,本人整理,仅供交流)
举报原因:
原因补充:

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