浮点数在计算机中存储方式---IEEE754格式存储

来源:互联网 发布:java开发工具 编辑:程序博客网 时间:2024/06/08 18:59

简单总结:

单精度浮点数: 1位符号位   8位阶码位   23位尾数

双精度浮点数: 1位符号位   11位阶码位   52位尾数


单精度float型存储在内存中的大小为4个字节,即32位。

 x           xxxxxxxx    xxxxxxxxxxxxxxxxxxxxxxx

数符(1b)     阶码(8b)      尾数(23b)


double型存储在内存中的大小为8个字节,即64位。

double型的浮点数分别是:数符(1b)、阶码(11b)、尾数(52b)



例1:float型浮点数125.5转化成32位二进制浮点数


125.5的二进制码为1111101.1,写成二进制的科学计数为:1.111101*2^6(因为科学计数法“整数”部分大于1,在二进制中,“整数”部分只能恒为1)即向左移6位,则e=6,则E=e+127=133,而E的二进制码为10000101,而1.111101把“整数”部分去除1之后为111101,之后补0,共23b,形成了阶码。


所以125.5的32位二进制浮点数为:

0 10000101 11110110000000000000000



例2:float型浮点数0.5转化成32位二进制浮点数


0.5的二进制码为0.1,写成二进制的科学计数为:1.0*2^(-1)即向右移1位,则e=-1,则E=e+127=126,而E的二进制码为01111110,而1.0把“整数”部分去除1之后为0,之后补0,形成了阶码。

 

所以0.5的32位二进制浮点数为

0 01111110 00000000000000000000000

double型浮点数类似。


例3:32位二进制浮点数为0 10000010 00010000000000000000000转化成十进制数浮点数


题中已给我们分了三部分,数符部分、阶码部分、尾数部分。

数符部分为0,则代表此数为正数;阶码部分为10000010,则E=130,则e=E-127=3,则说明其向左移了3位,0001加上“整数”部分的1之后,为1.0001。则原二进制数为1000.1=十进制8.5,或R=1.0001*2^3=8.5



什么是IEEE754格式存储


  IEEE 754 标准是IEEE浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号 ,等同于国际标准ISO/IEC/IEEE 60559 。该标准由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器标准委员会(Microprocessor Standards Committee, MSC)发布。


1简介

    IEEE浮点数算术标准(IEEE 754)是最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值(无穷与非数值(NaN)),以及这些数值的“浮点数运算子”;它也指明了四种数值修约规则和五种例外状况(包括例外发生的时机与处理方式)。
    IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43位以上,很少使用)与延伸双精确度(79位元以上,通常以80位元实做)。只有32位模式有强制要求,其他都是选择性的。大部分编程语言都有提供IEEE格式与算术,但有些将其列为非必要的。例如,IEEE 754问世之前就有的C语言。IEEE754标准包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。
该标准的全称为IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985),又称IEC 60559:1989,微处理器系统的二进制浮点数算术(本来的编号是IEC 559:1989)。后来还有“与基数无关的浮点数”的“IEEE 854-1987标准”,有规定基数为2跟10的状况。


2浮点数剖析

以下是该标准对浮点数格式的描述。
本文表示位元的约定
我们将电脑上一个长度为W的字节(word)其中的位元以0到W−1的整数编码,通常将最右边的位元编成0,以让编号最小的位元与最低效位元(least significant bit或lsb,代表最小位数,改变时对数值影响最小的位元)一致。声明这一点的必要性在于区分大端法和小端法。

整体呈现

二进制浮点数是以符号数值表示法格式储存,将最高效位元指定为符号位元(sign bit);“指数部份”,即次高效的e位元,为浮点数中经指数偏差(exponent bias)处理过后的指数;“小数部份”,即剩下的f位元,为有效位数(significand)减掉有效位数本身的最高效位元。 如下图所示:
符号位阶码尾数

指数偏差

指数偏差(表示法中的指数为实际指数减掉某个值)为
 ,其中的e为存储指数的比特的长度。减掉一个值是因为指数必须是有号数才能表达很大或很小的数值,但是有号数通常的表示法——补码(two's complement),将会使比较变得困难。为了解决这个问题,指数在存储之前需要做偏差修正,将它的值调整到一个无符号数的范围内以便进行比较。此外,指数采用这种方法表示的优点还在于使得浮点数的正规形式和非正规形式之间有了一个平滑的转变。

范例

小数部分最高有效位由指数部分决定。如果指数在0 < exponent <
 之间,那么小数部分最高有效位将是1,而且这个数将被称为正规形式。如果指数是0,有效数最高有效位将会是0,并且这个数将被称为非正规形式。这里有三个特殊值需要指出:
如果 指数 是0 并且 小数部分 是0, 这个数±0 (和符号位相关)
如果 指数 =
 并且 小数部分 是0, 这个数是 ±无穷大 (同样和符号位相关)
如果 指数 =
 并且 小数部分 非0, 这个数表示为不是一个数(NaN).
以上规则,总结如下:
形式指数小数部分零00非正规形式0非0正规形式1到
任意无穷
0NaN
非零

32位单精度

单精度二进制小数,使用32位存储。
1 8 23 位长
+-+--------+-----------------------+
|S| Exp | Fraction |
+-+--------+-----------------------+
31 30 23 22 0 位编号 (从右边开始为0)
偏正值 +127

64位双精度

双精度二进制小数,使用64位存储。
1 11 52 位长
+-+--------+-----------------------+
|S| Exp | Fraction |
+-+--------+-----------------------+
63 62 52 51 0 位编号 (从右边开始为0)
偏正值 +1023

3数位

S为符号位,Exp为指数位,Fraction为有效数位。 指数部分即使用所谓的偏正值形式表示,实际值为表示值与一个固定值(32位的情况是127)的和。采用这种方式表示的目的是简化比较。因为,指数的值可能为正也可能为负,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。正因为如此,指数部分通常采用一个无符号的正数值存储。单精度的指数部分是-126~+127加上127 ,指数值的大小从1~254(0和255是特殊值)。浮点小数计算时,指数值减去偏正值将是实际的指数大小。


0 0
原创粉丝点击