浮点型数据的格式IEEE754标准

浮点数存储

浮点数存储.txt世上最珍贵的不是永远得不到或已经得到的,而是你已经得到并且随时都有可能失去的东西!爱情是灯,友情是影子。灯灭时,你会发现周围都是影子。朋友,是在最后可以给你力量的人。浮点数: 浮点型变量在计算机内存中占用4字节(Byte),即32-bit。遵循IEEE-754格式标准。一个浮点数由2部分组成:底数m 和指数e。 ±mantissa × 2exponent (注意,公式中的mantissa 和 exponent使用二进制表示) 底数部分使用2进制数来表示此浮点数的实际值。 指数部分占用8-bit的二进制数,可表示数值范围为0-255。 指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float 的指数可从 -126到128 底数部分实际是占用24-bit的一个值,由于其最高位始终为 1 ,所以最高位省去不存储,在存储中只有23-bit。 到目前为止,底数部分 23位加上指数部分 8位使用了31位。那么前面说过,float是占用4个字节即32-bit,那么还有一位是干嘛用的呢?还有一位,其实就是4字节中的最高位,用来指示浮点数的正负,当最高位是1时,为负数,最高位是0时,为正数。 浮点数据就是按下表的格式存储在4个字节中: Address+0 Address+1 Address+2 Address+3 Contents SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S: 表示浮点数正负,1为负数,0为正数 E: 指数加上127后的值的二进制数 M: 24-bit的底数(只存储23-bit) 注意:这里有个特例,浮点数为0时,指数和底数都为0,但此前的公式不成立。因为2的0次方为1,所以,0是个特例。当然,这个特例也不用认为去干扰,编译器会自动去识别。 举例1:计算机存储中的二进制数如何转换成实际浮点数 通过上面的格式,我们下面举例看下-12.5在计算机中存储的具体数据: Address+0 Address+1 Address+2 Address+3 Contents 0xC1 0x48 0x00 0x00 接下来我们验证下上面的数据表示的到底是不是-12.5,从而也看下它的转换过程。 由于浮点数不是以直接格式存储,他有几部分组成,所以要转换浮点数,首先要把各部分的值分离出来。 Address+0 Address+1 Address+2 Address+3 格式 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM

2.浮点数的存储原理

问题:long和float类型都是四个字节,为什么存储数值的范围相差极大? 原因:因为两者的存储原理时不同的。 浮点数的存储原理 作者: jillzhang 联系方式:jillzhang@https://www.360docs.net/doc/b010733796.html, 本文为原创,转载请保留出处以及作者,谢谢 C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。 无论是单精度还是双精度在存储中都分为三个部分: 1.符号位(Sign) : 0代表正,1代表为负 2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储 3.尾数部分(Mantissa):尾数部分 其中float的存储方式如下图所示: 而双精度的存储方式为:

R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25*,而120.5可以表示为:1.205*,这些小学的知识就不用多说了吧。而我们傻蛋计算机根本不认识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,我靠,不会连这都不会转换吧?那我估计要没辙了。120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为1.0001* ,1110110.1可以表示为1.1101101*,任何一个数都的科学计数法表示都为1.xxx*,尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127,下面就看看8.25和120.5在内存中真正的存储方式。 首先看下8.25,用二进制的科学计数法表示为:1.0001* 按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示: 而单精度浮点数120.5的存储方式如下图所示:

有关浮点数在内存中的存储

有关浮点数在内存中的存储 最近想看一下C中float和double型数据在内存中是如何表示的,找到了如下一些东东,与大家分享一下 c语言中FLOAT 是如何表示的?尾数,阶码是如何在32位上安排的,即哪几位是尾数,哪几位是阶码,那一位是符号位。听说与CPU有关,是真的吗? 在C++里,实数(float)是用四个字节即三十二位二进制位来存储的。其中有1位符号位,8位指数位和23位有效数字位。实际上有效数字位是24位,因为第一位有效数字总是“1”,不必存储。 有效数字位是一个二进制纯小数。8位指数位中第一位是符号位,这符号位和一般的符号位不同,它用“1”代表正,用”0“代表负。整个实数的符号位用“1”代表负,“0”代表正。 在这存储实数的四个字节中,将最高地址字节的最高位编号为31,最低地址字节的最低位编号为0,则实数各个部分在这32个二进制位中的分布是这样的:31位是实数符号位,30位是指数符号位,29---23是指数位,22---0位是有效数字位。注意第一位有效数字是不出现在内存中的,它总是“1”。 将一个实数转化为C++实数存储格式的步骤为: (1)先将这个实数的绝对值化为二进制格式,注意实数的整数部分和小数部分化为二进制的方法是不同的。 (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。 (3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。 (4)如果实数是正的,则在第31位放入“0”,否则放入“1”。 (5)如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。 (6)如果n是左移得到的,则将n减去一然后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。 将一个计算机里存储的实数格式转化为通常的十进制的格式的方法如下: (1)将第22位到第0位的二进制数写出来,在最左边补一位“1”,得到二十四位有效数字。将小数点点在最左边那个“1”的右边。 (2)取出第29到第23位所表示的值n。当30位是“0”时将n各位求反。当30位是“1”时将n增1。 (3)将小数点左移n位(当30位是“0”时)或右移n位(当30位是“1”时),得到一个二进制表示的实数。 (4)将这个二进制实数化为十进制,并根据第31位是“0”还是“1”加上正号或负号即可。

浮点数在内存中的存储方式

浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式 为10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。 在二进制科学表示法中,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 尾数:有效数字位,即部分二进制位(小数点后面的二进制位),因为规定M的整数部分恒为1,所以这个1就不进行存储了。

下面举例说明: float型数据125.5转换为标准浮点格式 125二进制表示形式为1111101,小数部分表示为二进制为1,则125.5二进制表示为1111101.1,由于规定尾数的整数部分恒为1,则表示为1.1111011*2^6,阶码为6,加上127为133,则表示为10000101,而对于尾数将整数部分1去掉,为1111011,在其后面补0使其位数达到23位,则为11110110000000000000000 则其二进制表示形式为 0 10000101 11110110000000000000000,则在内存中存放方式为: 00000000 低地址 00000000 11111011 01000010 高地址 而反过来若要根据二进制形式求算浮点数如0 10000101 11110110000000000000000 由于符号为为0,则为正数。阶码为133-127=6,尾数为11110110000000000000000,则其真实尾数为1.1111011。所以其大小为 1.1111011*2^6,将小数点右移6位,得到1111101.1,而1111101的十进制为125,0.1的十进制为1*2^(-1)=0.5,所以其大小为125.5。 同理若将float型数据0.5转换为二进制形式

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

浮点数在计算机内存中的存储格式 对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用 32bit,double数据占用 64bit,我们在声明一个变量float f = 2.25f的时候,是如何分配内存的呢?其实不论是float类型还是double类型,在计算机内存中的存储方式都是遵从IEEE的规范的,float 遵从的是IEEE R32.24 ,而double 遵从的是R64.53。 无论是单精度还是双精度,在内存存储中都分为3个部分: 1) 符号位(Sign):0代表正,1代表为负; 2) 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储; 3) 尾数部分(Mantissa):尾数部分; 其中float的存储方式如下图所示: 而双精度的存储方式为: R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十 进制的科学计数法表示就为:8.25*,而120.5可以表示为:1.205*。而我 们傻蛋计算机根本不认识十进制的数据,它只认识0和1,所以在计算机内存中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,120.5用二进制表示为:1110110.1。用二进制的科学计数法 表示1000.01可以表示为1.00001*,1110110.1可以表示为 1.1101101*,任何一个数的科学计数法表示都为 1.xxx*, 尾数部分就可以表示为xxxx,第一

位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了 24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127。 下面就看看8.25和120.5在内存中真正的存储方式: 首先看下8.25,用二进制的科学计数法表示为:1.0001* 按照上面的存储方式,符号位为0,表示为正;指数位为3+127=130,位数部分为 1.00001,故8.25的存储方式如下: 0xbffff380: 01000001000001000000000000000000 分解如下:0--10000010--00001000000000000000000 符号位为0,指数部分为10000010,位数部分为 00001000000000000000000 同理,120.5在内存中的存储格式如下: 0xbffff384: 01000010111100010000000000000000 分解如下:0--10000101--11100010000000000000000 那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值呢?其实就是对上面的反推过程,比如给出如下内存数据: 01000001001000100000000000000000 第一步:符号位为0,表示是正数; 第二步:指数位为10000010,换算成十进制为130,所以指数为130-127=3; 第三步:尾数位为01000100000000000000000,换算成十进制为 (1+1/4+1/64); 所以相应的十进制数值为:2^3*(1+1/4+1/64)=8+2+1/8=10.125 再看一个例子,观察其输出: 02 { 03 float f1 = 2.2; 04 float f2 = 2.25;

单双精度浮点数的IEEE标准格式

单双精度浮点数的IEEE标准格式 目前大多数高级语言(包括C)都按照IEEE-754标准来规定浮点数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用 8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11为阶,53 位尾数和1位符号位,如下图所示: 31 30 23 22 0 63 62 52 51 0 细心的人会发现,单双精度各部分所占字节数量比实际存储格式都了一位,的确是这样,事实是,尾数部分包括了一位隐藏位,允许只存储23位就可以表示24位尾数,默认的1位是规格化浮点数的第一位,当规格化一个浮点数时,总是调整它使其值大于等于1而小于2,亦即个位总是为1。例如1100B,对其规格化的结果为1.1乘以2的三次方,但个位1并不存储在23位尾数部分内,这个1是默认位。 阶以移码的形式存储。对于单精度浮点数,偏移量为127(7FH),而双精度的偏移量为1023(3FFH)。存储浮点数的阶码之前,偏移量要先加到阶码上。前面例子中,阶为2的三次方,在单精度浮点数中,移码后的结果为127+3即130(82H),双精度为1026(402H)。 浮点数有两个例外。数0.0存储为全零。无限大数的阶码存储为全1,尾数部分全零。符号位指示正无穷或者负无穷。 下面举几个例子:

所有字节在内存中的排列顺序,intel的cpu按little endian顺序,motorola 的cpu按big endian顺序排列。

IEEE754标准的一个规格化 32位浮点数x的真值可表示为 x=(-1)^S*(1.M)*2^(E-127)e=E-127 31 30 23 0 |S | E |M | [例1]若浮点数x的754标准存储格式为(41360000)16,求其浮点数的十进制数值。 解:将16进制展开后,可得二进制数格式为 0 100,0001,0 011,0110,0000,0000,0000,0000 S E M 指数e=100,0001,0-01111111=00000011=(3)10 包含隐藏位1的尾数1.M=1.011,0110,0000,0000,0000,0000 于是有x=(-1)^0*(1.M)*2^(E-127) =+(1.011011)2*2^3 =(11.375)10 [例2]将数(20.59375)10转化为754标准的32位浮点数的二进制存储格式。解:首先分别将整数部分和小数部分转换成二进制 (20.59375)10=+(10100.10011)2 然后移动小数点使其在1,2位之间 10100.10011=1.010010011*2^4 e=4 于是得到:S=0,E=e+127=131,M=010010011 最后得到32位浮点数的二进制存储格式为 0 100,0001,1 010,0100,1100,0000,0000,0000 =(41A4C000)16 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。 任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在 x86CPU上一个字节是8位。比如一个16位(2字节)的 short int型变量的值是1000,那么它的二进制表达就是:00000011 11101000。由于Intel CPU的架构原因,它是按字节倒序存储的,那么就因该是这样:11101000 00000011,这就是定点数1000在内存中的结构。 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: ````````符号位阶码尾数长度 float 1 8 23 32 double 1 11 52 64

浮点数的二进制表示学习笔记

文章1: 单双精度浮点数的IEEE标准格式 目前大多数高级语言(包括C)都按照IEEE-754标准来规定浮点数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11为阶,53位尾数和1 51 0 细心的人会发现,单双精度各部分所占字节数量比实际存储格式都了一位,的确是这样,事实是,尾数部分包括了一位隐藏位,允许只存储23位就可以表示24位尾数,默认的1位是规格化浮点数的第一位,当规格化一个浮点数时,总是调整它使其值大于等于1而小于2,亦即个位总是为1。例如1100B,对其规格化的结果为1.1乘以2的三次方,但个位1并不存储在23位尾数部分内,这个1是默认位。 阶以移码的形式存储。对于单精度浮点数,偏移量为 127(7FH),而双精度的偏移量为1023(3FFH)。存储浮点数的阶码之前,偏移量要先加到阶码上。前面例子中,阶为2的三次方,在单精度浮点数中,移码后的结果为127+3即130(82H),双精度为 1026(402H)。 浮点数有两个例外。数0.0存储为全零。无限大数的阶码存储为全

1,尾数部分全零。符号位指示正无穷或者负无穷。 motorola 的cpu按big endian顺序排列。 浮点数的二进制表示学习笔记 基础知识: 十进制转十六进制; 十六进制转二进制; IEEE制定的浮点数表示规则; 了解: 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行 float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: 符号位阶码尾数长度 float 1 8 23 32 double 1 11 52 64 以下通过几个例子讲解浮点数如何转换为二进制数

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

C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE 的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。 无论是单精度还是双精度在存储中都分为三个部分: 1.符号位(Sign) : 0代表正,1代表为负 2.指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移 位存储 3.尾数部分(Mantissa):尾数部分 其中float的存储方式如下图所示: 而双精度的存储方式为: R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25 用十进制的科学计数法表示就为:8.25*,而120.5可以表示 为:1.205*,这些小学的知识就不用多说了吧。而我们傻蛋计算机根本不认 识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,我靠,不会连这都不会转换吧?那我估计要没辙了。120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为

1.0001*,1110110.1可以表示为1.1101101*,任何一个数都的科学计 数法表示都为1.xxx*,尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127,下面就看看8.25和120.5在内存中真正的存储方式。 首先看下8.25,用二进制的科学计数法表示为:1.00001* 按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示: 而单精度浮点数120.5的存储方式如下图所示:

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

浮点数在计算机中的存储方式 2011-11-29 10:42:52| 分类:计算机 | 标签:浮点数单精度双精度存储|字号订阅C语言和C#语言中,对于浮点型的数据采用单精度类型(float)和双精度类型(double)来存储: float 数据占用32bit; double 数据占用64bit; 我们在声明一个变量float f = 2.25f 的时候,是如何分配内存的呢? 其实不论是float 类型还是double 类型,在存储方式上都是遵从IEEE的规范: float 遵从的是IEEE R32.24; double 遵从的是IEEE R64.53; 单精度或双精度在存储中,都分为三个部分: 符号位(Sign):0代表正数,1代表为负数; 指数位(Exponent):用于存储科学计数法中的指数数据; 尾数部分(Mantissa):采用移位存储尾数部分; 单精度float 的存储方式如下: 双精度double 的存储方式如下:

R32.24 和R64.53 的存储方式都是用科学计数法来存储数据的,比如: 8.25 用十进制表示为:8.25 * 100 120.5 用十进制表示为:1.205 * 102 而计算机根本不认识十进制的数据,他只认识0和1。所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示: 8.25 用二进制表示为:1000.01 120.5 用二进制表示为:1110110.1 而用二进制的科学计数法表示1000.1,可以表示为1.0001 * 23 而用二进制的科学计数法表示1110110.1,可以表示为1.1101101 * 26 任何一个数的科学计数法表示都为1. xxx * 2n ,尾数部分就可以表示为xxxx,由于第一位都是1嘛,干嘛还要表示呀?所以将小数点前面的1省略。 由此,23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里。 那24bit 能精确到小数点后几位呢?我们知道9的二进制表示为1001,所以4bit 能精确十进制中的1位小数点,24bit就能使float 精确到小数点后6位; 而对于指数部分,因为指数可正可负(占1位),所以8位的指数位能表示的指数范围就只能用7位,范围是:-127至128。所以指数部分的存储采用移位存储,存储的数据为元数据+127。 注意: 元数据+127:大概是指“指数”从00000000开始(表示-127)至11111111(表示+128)所以,10000000表示指数1 (127 + 1 = 128 --> 10000000 ) ;

浮点数存储

最近一段时间看到版上关于C++里浮点变量精度的讨论比较多,那么我就给对这个问题有疑惑的人详细的讲解一下intel的处理器上是如何处理浮点数的。为了能更方便的讲解,我在这里只以float型为例,从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。还要说的一点是文章和程序一样,兼容性是有一定范围的,所以你想要完全读懂本文,你最好对二进制、十进制、十六进制的转换有比较深入的了解,了解数据在内存中的存储结构,并且会使用https://www.360docs.net/doc/b010733796.html,编译简单的控制台程序。OK,下面我们开始。 大家都知道任何数据在内存中都是以二进制(1或着0)顺序存储的,每一个1或着0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2字节)的short int型变量的值是1156,那么它的二进制表达就是:00000100 10000100。由于Intel CPU的架构是Little Endian(请参数机算机原理相关知识),所以它是按字节倒序存储的,那么就因该是这样:10000100 00000100,这就是定点数1156在内存中的结构。 那么浮点数是如何存储的呢?目前已知的所有的C/C++编译器都是按照IEEE (国际电子电器工程师协会)制定的IEEE 浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(正或负)、指数和尾数来表示,底数被确定为2,也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。下面来看一下具体的float的规格: float 共计32位,折合4字节 由最高到最低位分别是第31、30、29、 0 31位是符号位,1表示该数为负,0反之。 30-23位,一共8位是指数位。 22-0位,一共23位是尾数位。 每8位分为一组,分成4组,分别是A组、B组、C组、D组。 每一组是一个字节,在内存中逆序存储,即:DCBA 我们先不考虑逆序存储的问题,因为那样会把读者彻底搞晕,所以我先按照顺序的来讲,最后再把他们翻过来就行了。 现在让我们按照IEEE浮点数表示法,一步步的将float型浮点数12345.0f转换为十六进制代码。在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示:1 11100010 01000000也可以这样表示:11110001001000000.0 然后将小数点向左移,一直移到离最高位只有1位,就是最高位的1: 1.11100010010000000一共移动了16位,在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于这样: 1.11100010010000000 * ( 2 ^ 16 )好了,现在我们要的尾数和指数都出来了。显而易见,最高位永远是1,因为你不可能把买了16个鸡蛋说

浮点数(单精度浮点数与双精度浮点数)在计算机中的存储

浮点数在计算机中的存储 十进制浮点数格式: 浮点数格式使用科学计数法表示实数。科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数(exponent)两部分。比如3.684*10^2. 在十进制中,指数的基数为10,并且表示小数点移动多少位以生成系数。每次小数点向前移动时,指数就递增;每次小数点向后移动时,指数就递减。例如,25.92 可表示为2.592 * 10^1,其中2.592 是系数,值10^1 是指数。必须把系数和指数相乘,才能得到原始的实数。另外,如0.00172 可表示为1.72*10^-3,数字1.72 必须和10^-3 相乘才能获得原始值。 二进制浮点格式: 计算机系统使用二进制浮点数,这种格式使用二进制科学计数法的格式表示数值。数字按照二进制格式表示,那么系数和指数都是基于二进制的,而不是十进制,例如1.0101*2^2. 在十进制里,像0.159 这样的值,表示的是0 + (1/10) + (5/100) + (9/1000)。相同的原则也适用二进制。比如,1.0101 乘以2^2 后,生成二进制值101.01 ,这个值表示二进制整数5,加上分数(0/2) + (1/4) 。这生成十进制值5.25 。下表列出几个二进制 编写二进制浮点值时,二进制通常被规格化了。这个操作把小数点移动到最左侧的数位,并且修改指针进行补偿。例如1101.011 变成1.101011*2^3 浮点数的存储 ?IEEE 标准754 浮点数标准使用3 个成分把实数定义为二进制浮点值: ?符号 ?有效数字

?指数 符号位表示值是负的还是正的。符号位中的1 表示负值,0 表示正值。 有效数字部分表示浮点数的系数(coefficient)(或者说尾数(mantissa))。系数可以是规格化的(normalized),也可以是非规格化的(denormalized)。所谓规格化,就是任何一个数的科学计数法的表示都可为1.xxx*2^n,既然小数点左边的一位都是1,就可以把这一位省略。单精度浮点数23bit的尾数部分,可表示的精度却为24位,道理就在这里。 指数表示浮点数的指数部分,是一个无符号整数。因为指数值可以是正值,也可以是负值,所以通过一个偏差值对它进行置偏,及指数的真实值=指数部分的整数—偏差值。对于32位浮点数,偏差值=127;对于64位浮点数,偏差值=1023. 浮点数的这3 个部分被包含在固定长度的数据格式之内。IEEE 标准754 定义了浮点数的两种长度:32位单精度和64位双精度 可以用于表示有效数字的位的数量决定精度。下图显示了两种不同精度类型的位布局: 单精度浮点使用23 位有效数字值。但是,浮点格式假设有效数字的整数部分永远为1 ,并且不在有效数字值中使用它。这样实际上有效数字的精度达到了24 位。指数使用8 位值,它的范围从0~255,称为移码指数,意思是必须从指数中减去一个数(称为偏移量或者是偏差值),对单精度浮点数而言,这个值是127 。当指数是0和255时,指数由别的含义,因此实际指数的范围是从-126 到+127 (二进制指数),这样整个浮点数的范围则为:(1.18 * 10^-38~1.0×2……-126 到3.40 * 10^38~1.1……1×2^127)。 ?指数0和255用于特殊用途。如果指数从1变化到254,则由s(符号位)、e(指数)和f(有效数)来表示的数为: ?

VC6.0中float(单精度)在内存中的存储格式

浮点型变量在计算机内存中占用4字节(Byte),即32-bit。遵循IEEE-754格 式标准。 一个浮点数由2部分组成:底数m 和指数e。 ±mantissa × 2exponent (注意,公式中的mantissa 和 exponent使用二进制表示) 底数部分使用2进制数来表示此浮点数的实际值。 指数部分占用8-bit的二进制数,可表示数值范围为0-255。但是指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float的指数可从 -126到128. 底数部分实际是占用24-bit的一个值,由于其最高位始终为 1 ,所以最高位省去不存储,在存储中只有23-bit。 到目前为止,底数部分 23位加上指数部分 8位使用了31位。那么前面说过,float是占用4个字节即32-bit,那么还有一位是干嘛用的呢?还有一位,其实就是4字节中的最高位,用来指示浮点数的正负,当最高位是1时,为负数,最高位是0时,为正数。 浮点数据就是按下表的格式存储在4个字节中: Address+0 Address+1 Address+2 Address+3 Contents SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S: 表示浮点数正负,1为负数,0为正数 E: 指数加上127后的值的二进制数 M: 24-bit的底数(只存储23-bit) 主意:这里有个特例,浮点数为0时,指数和底数都为0,但此前的公式不成立。因为2的0次方为1,所以,0是个特例。当然,这个特例也不用认为去干扰,编译器会自动去识别。 通过上面的格式,我们下面举例看下-12.5在计算机中存储的具体数据: Address+0 Address+1 Address+2 Address+3 Contents 0xC1 0x48 0x00 0x00接下来我们验证下上面的数据 表示的到底是不是-12.5,从而也看下它的转换过程。 由于浮点数不是以直接格式存储,他有几部分组成,所以要转换浮点数,首先要把各部分的值分离出来。 Address+0 Address+1 Address+2 Address+3 格式 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM 二进制 11000001 01001000 00000000 00000000 16进 制 C1 48 00 00 可见: S: 为1,是个负数。 E:为 10000010 转为10进制为130,130-127=3,即实际指数部分为3. M:为 10010000000000000000000。这里,在底数左边省略存储了一个1,

浮点数的存储格式

浮点数的存储格式 基于IEEE 754的浮点数存储格式 IEEE(Institute of Electrical and Electronics Engineers,电子电气工程师协会)在I985年制定的IEEE 754(IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Std 754-1985 )二进制浮点运算规范,是浮点运算部件事实上的工业标准。 1 浮点数 在计算机系统的发展过程中,曾经提出过多种方法表示实数,但是到目前为止使用最广泛的是浮点表示法。相对于定点数而言,浮点数利用指数使小数点的位置可以根据需要而上下浮动,从而可以灵活地表达更大范围的实数。 浮点数表示法利用科学计数法来表达实数。通常,将浮点数表示为± d.dd…d ×βe,其中d.dd… d 称为有效数字(significand),它具有p 个数字(称p位有效数字精度),β为基数(Base),e为指数(Exponent),±表示实数的正负[1,2]。更精确地,± d0.d1d2…d p-1× βe,表示以下数 ±(d0+d1β-1+… +d p-1β-(p-1))βe,(0≤d i<β= 对实数的浮点表示仅作如上的规定是不够的,因为同一实数的浮点表示还不是唯一的。例如,1.0×102,0.1 ×103,和0.01 ×104都可以表示100.0。为了达到表示单一性的目的,有必要对其作进一步的规范。规定有效数字的最高位(即前导有效位)必须非零,即0<d0<β。符合该标准的数称为规格化数(Normalized Numbers),否则称为非规格化数(Denormalized Numbers)。 2 IEEE 754浮点数与其浮点格式 2.1 实数的IEEE 754表示形式 一个实数V在IEEE 754标准中可以用V=(-1)s×M×2E的形式表示[3,4],说明如下: (1)符号s(sign)决定实数是正数(s=0)还是负数(s=1),对数值0的符号位特殊处理。 (2)有效数字M(significand)是二进制小数,M的取值范围在1≤M<2或0≤M<1。 (3)指数E(exponent)是2的幂,它的作用是对浮点数加权。 2.2 浮点格式 浮点格式是一种数据结构,它规定了构成浮点数的各个字段,这些字段的布局,及其算术解释[2]。IEEE 754浮点数的数据位被划分为3个字段,对以上参数值进行编码: (1)一个单独的符号位s直接编码符号s。 (2)k位的偏置指数e(e=e k-1…e1e0)编码指数E,移码表示。 (3)n位的小数f(fraction)(f=f n-1…f1f0)编码有效数字M,原码表示。 2.3 浮点数的分类

IEEE754 单精度浮点型数据存储转换

目录 1 转换工具 (2) 2 浮点数在内存中的表示 (2) 3 单精度浮点数转换为存储字节步骤 (2) 4 存储字节转换为单精度浮点数 (3)

1 转换工具 小程序:高级程序员工具 2 浮点数在内存中的表示 对于浮点类型的数据,采用单精度类型(float)和双精度类型(double)来存储,float 数据占32位,double数据占64位。无论是float还是double在存储方式上都是遵从IEEE 的规范的,float遵从的是IEEE R32.24,而double 遵从的是IEEE R64.53。 无论是单精度还是双精度在存储中都分为三个部分: 1. 符号位(Sign):0代表正,1代表为负 2. 指数位(Exponent):用于存储科学计数法中的指数部分,采用移位存储 3. 尾数位(Mantissa):尾数部分 float类型的存储方式如下图所示: 3130220 double类型的存储方式如下图所示: 6362510 3 单精度浮点数转换为存储字节步骤 将一个float型转化为内存存储格式的步骤为: (1)先将这个实数的绝对值化为二进制格式。 (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。 (3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。 (4)如果实数是正的,则在第31位放入“0”,否则放入“1”。 (5)如果n是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。 (6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。 以12.5为例进行说明: (1)12.5实数绝对值二进制形式是1100.1。 (2)向左移动3位,转换为科学计数法是1.1001E3,此时n=3。 (3)将小数点右边第一位开始输出23位放入第22到第0位,即尾数位为:

浮点型数据的存储格式

组成员:张洋、徐虞清、卢鸣仪、陶晨诚、余太聪、张成玉、黄顺.主讲:黄顺 C++ 浮点型数据存储格式研究

前言: 在计算机C ++ 程序设计语言中, 浮点数的表示与使用一直是一个重点、难点. 浮点型数据的二进制存储格式是一个较难以理解和描述的问题,不同的教科书采用不同的讲解方法, 个别还存在概念上的错误, 给学习、理解和正确使用带来误导.C ++ 浮点数存储结构, 在设计初期充分考虑到了它的简单性、可移植性、稳定性和安全性, 遵从了与C /C++相同的方式, 使用IEEE 754二进制浮点数运算标准, 将浮点型数据分为: 单精度浮点型( float)、双精度浮点型 ( doub le)和扩展双精度浮点型( long double) .

计算机中数据的基本类型包括整型、实型和字 符型三大类. 实型数据的存储格式相对于整形、字符型复杂很多, 一般使用浮点表示法来表示实数型数据. 浮点型数据是指采用指 数方法, 利用小数点的位置可以根据需要左右浮动, 灵活地表示 更大范围内的实型数据. 一个浮点数N 可以由两个数M 和E 来表示: 其中B 为基数, E 为指数,M 为尾数, M是形如 的n位数, 如果M 的第一位是非0整数, 即0< d < B, M 称作规格化. 规格化规定有效数字的最高位必须非零, 符合该标准的数称 为规格化数(N orma lized Numbers) , 否则称为非规格化数 ( Denorma lized Numbers). 浮点数都是近似表示实数的, 数据 精度由尾数M 决定, 数的表示范 围由B 和E 决定.

IEEE 754是电子电气工程师协会IEEE ( Inst i tute of E lectrical and E lectron ics Eng ineers) 1985 年制定的二进制浮点运算标准. 标准规定了三种浮点数的表示方式: 单精度浮点数、双精度浮点数和扩展双精度浮点数. 标准中二进制浮点数由符号位、阶码和尾数三部分构成, 二进制浮点数基数为2, 由于规格化方法, 尾数最高位数字位总是1, 表示为1. ,fIEEE 754二进制浮点数运算标准将尾数最高位1隐含, 使尾数表示的数据范围比实际存储的多1位. 按照IEEE 754二进制浮点运算标准, 单精度浮点数fps in gle 和双精度浮点数fpdouble可以表示为: 式中: S为符号位, f为尾数, exp为阶码. ( 1) 符号S决定浮点数是正数或负数, S= 0为正数, S= 1为负数, 对于数值0 的符号位特殊处理. ( 2) 尾数f是二进制小数, 用源码表示, f=M-1, f的数值范围为 ( 3) 阶码exp是指数E 的移码[ 1] , 单精度浮点数exp= E + 127, 双精度浮点数exp= E+ 1023.

浮点数存储

浮点数存储.txt (注意,公式中的mantissa 和 exponent使用二进制表示) 底数部分使用2进制数来表示此浮点数的实际值。 指数部分占用8-bit的二进制数,可表示数值范围为0-255。 指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float 的指数可从 -126到128 底数部分实际是占用24-bit的一个值,由于其最高位始终为 1 ,所以最高位省去不存储, 在存储中只有23-bit。 到目前为止,底数部分 23位加上指数部分 8位使用了31位。那么前面说过,float是 占用4个字节即32-bit,那么还有一位是干嘛用的呢?还有一位,其实就是4字节中的最高 位,用来指示浮点数的正负,当最高位是1时,为负数,最高位是0时,为正数。 浮点数据就是按下表的格式存储在4个字节中: Address+0 Address+1 Address+2 Address+3 Contents SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S: 表示浮点数正负,1为负数,0为正数 E: 指数加上127后的值的二进制数 M: 24-bit的底数(只存储23-bit) 注意:这里有个特例,浮点数为0时,指数和底数都为0,但此前的公式不成立。因为2 的0次方为1,所以,0是个特例。当然,这个特例也不用认为去干扰,编译器会自动去识别。 举例1:计算机存储中的二进制数如何转换成实际浮点数 通过上面的格式,我们下面举例看下-12.5在计算机中存储的具体数据: Address+0 Address+1 Address+2 Address+3 Contents 0xC1 0x48 0x00 0x00 接下来我们验证下上面的数据表示的到底是不是-12.5,从而也看下它的转换过程。 由于浮点数不是以直接格式存储,他有几部分组成,所以要转换浮点数,首先要把各部分 的值分离出来。 Address+0 Address+1 Address+2 Address+3 格式 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM 二进制 11000001 01001000 00000000 00000000 16进制 C1 48 00 00 可见:

相关文档
最新文档