当前位置:文档之家› 浮点数的存储格式

浮点数的存储格式

浮点数的存储格式
浮点数的存储格式

浮点数的存储格式

基于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 浮点数的分类

根据偏置指数e的值,被编码的浮点数可分成三种类型。

(1)规格化数

当有效数字M在范围1≤M<2中且指数e的位模式e k-1…e1e0既不全是0也不全是1时,浮点格式所表示的数都属于规格化数。这种情况中小数f(0≤f<1 ) 的二进制表示为0. f n-…f1f0。有效数字M=1+f,即M=1. f n-1…f1f0(其中小数点左侧的数值位称为前导有效位) 1

。我们总是能调整指数E,使得有效数字M在范围1≤M<2中,这样有效数字的前导有效位总是1,因此该位不需显示表示出来,只需通过指数隐式给出。

需要特别指出的是指数E要加上一个偏置值Bias,转换成无符号的偏置指数e,也就是说指数E要以移码的形式在存放计算机中。且e、E和Bias三者的对应关系为e=E+Bias,其中Bias=2k-1-1。

(2)非规格化数

当指数e的位模式e k-1…e1e0全为零(即e=0)时,浮点格式所表示的数是非规格化数。这种情况下,E=1-Bais,有效数字M=f=0. f n-1…f1f0,有效数字的前导有效位为0。

非规格化数的引入有两个目的。其一是它提供了一种表示数值0的方法,其二是它可用来表示那些非常接近于0.0的数。

(3)特殊数

当指数e的位模式e k-1…e1e0全为1时,小数f的位模式f n-1…f1f0全为0(即f=0)时,该浮点格式所表示的值表示无穷,s=0 时是+∞,s=1时是-∞。

当指数e的位模式e k-1…e1e0全为1时,小数f的位模式f n-1…f1f0不为0(f n-1、…、f1、f0、至少有一个非零即f≠0)时,该浮点格式所表示的值被称为NaN(Not a Number)。比如当计算或∞-∞时用作返回值,或者用于表示未初始化的数据。

3 IEEE 754浮点存储格式

与浮点格式对应,浮点存储格式规定了浮点格式在存储器中如何存放。IEEE标准定义了这些浮点存储格式,但具体选择哪种存储格式由实现工具(程序设计语言)决定。

汇编语言软件有时取决于所使用的存储格式,但更高级的语言通常仅处理浮点数据类型的语言概念。这些浮点数据类型在不同高级语言中有不同的名字,相应的IEEE格式如表1。

表1 IEEE 格式和语言类型

IEEE 754标准准确地定义了单精度和双精度浮点格式,并为这两种基本格式的分别定义了扩展格式,表1里扩展双精度格式是IEEE标准定义的扩展双精度类中的一种。

下面详细讨论在Intel x86和SPARC平台上使用的三种IEEE浮点存储格式。

3.1 单精度格式

IEEE单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位

的小数f;23:30位包含8位指数e;第31位包含符号s。如图1所示。

图1 单精度存储格式

一般地,32位字的第0位存放小数f的最低有效位LSB(the least significant bit),第22位存放小数f的最高有效位MSB(the most significant bit);第23位存放偏置指数的最低有效位LSB,第30位存放偏置指数的最高有效位MSB;最高位,第31位存放符号s。

3.2 双精度格式

IEEE双精度浮点格式共64位,占2个连续32位字,包含三个构成字段:52位的小数f,11位的偏置指数e,1位的符号位s。将这2个连续的32位字整体作为一个64位的字,进行重新编号。其中0:51位包含52位的小数f;52:62位包含11位的偏置指数e;而最高位,第63位包含符号位s。如图2所示。

图 2 双精度浮点数的存储格式

f[31:0]存放小数f的低32位,其中第0位存放整个小数f的最低有效位LSB,第31位存放小数f的低32位的最高有效位MSB。

在另外的32位的字里,第0 到19位,即f[51:32],存放小数f的最高的20位,其中第0位存放这20位最高有效数中的最低有效位LSB,第19位存放整个小数f的最高有效位MSB。第20到30位,即e[52:62],存放11位的偏置指数e,其中第20位存放偏置指数的最低有效位LSB,第30位存放最高有效位MSB。最高位,第31位存放符号位s。

在Intel x86结构计算机中,数据存放采用小端法(little endian),故较低地址的32位的字中存放小数f的f[31:0]位。而在在SPARC结构计算机中,因其数据存放采用大端法(big endian),故较高地址的32位字中存放小数f的f[31:0]位。

3.3 扩展双精度格式

⑴扩展双精度格式(SPARC 结构计算机)

该4倍精度浮点环境符合IEEE关于扩展双精度格式的定义。该浮点环境的4倍精度浮点格式共128位,占4个连续32位字,包含3个构成字段:112位的小数f,15位的偏置指数e,和1位的符号s。将这4个连续的32位字整体作为一个128位的字,进行重新编号。其中0:110位包含小数f;112:126位包含偏置指数e;第127位包含符号位s。如图3所示。

在SPARC结构计算机中,地址最高的32位字存放小数的32位最低有效位,即f[31:0];但是在PowerPC结构计算机中,却是地址最低的32位字存放这些位。

紧邻的两个32位字(在SPARC机中向下计算,在PowerPC机中向上计算)分别存放f[63:32]和f[95:64]。

最后一个字的第0到15位存放小数的最高16位,即f[111:96]。其中第0位存放该16位的最低有效位,第15位存放整个小数f的最高有效位。第16到30位存放15位的偏置指数e,其中第16位存放偏置指数的最低有效位,第30位存放它的最高有效位。最高位,第31位存放符号s。

图 3 扩展双精度存储格式(SPARC 结构计算机)

⑵扩展双精度格式(Intel x86结构计算机)

该浮点环境双精度扩展格式符合IEEE双精度扩展格式的定义。该浮点环境的扩展双精度格式共80位,占3个连续32位字,包含四个构成字段:63位的小数f,1位显式前导有效位(explicit leading significand bit)j,15位偏置指数e,和1位符号位s。将这3个连续的32位字整体作为一个96位的字,进行重新编号。其中0:63包含63位的小数f,第63 位包含前导有效位j,64:78位包含15位的偏置指数e,最高位第79位包含符号位s。

在Intel结构系计算机中,这些字段依次存放在十个连续的字节中。但是,由于UNIX System V Application Binary Interface Intel 386 Processor Supplement (Intel ABI) 要求双精度扩展参数,从而占用堆栈中3个相连地址的32位字,其中最高一个字的高16位未被使用,如图4所示。

图4 扩展双精度存储格式(Intel x86结构计算机)

地址最低的32位字存放小数f的低32位,即f[31:0]。其中第0位存放整个小数f的最低有效位LSB 第31位存放小数低32位的最高有效位MSB。

地址居中的32位字,第0到30位存放小数f的31位最高位,即f[62:32]。其中第0位存放31位最高小数位的最低有效位LSB,第30位存放整个小数的最高有效位,地址居中的32位字的最高位第31位存放显式的前导有效位j。

地址最高32位字里,第0到14位存放15位的偏置指数e,第0位存放偏置指数的最低有效位LSB,第14位存放最高有效位MSB,第15位存放符号位s。虽然地址最高的32位字的高16位在Intel x86结构系列机种未被使用,但他们对符合Intel ABI的规定来说,

是必需的。

4 总结

以上讨论了Intel x86、Power PC和SPARC平台上使用的三种IEEE 754浮点数格式及其存储格式,下面对浮点数的相关参数进行总结,具体见表2。

表2 IEEE 浮点格式参数总结

浮点数的存储格式

IEEE floating point standard

上面我们说了,浮点数的小数点是不固定的,如果每个人都按照自己的爱好存储在电脑里,那不就乱套了吗?那么怎么在计算机中存储这种类型的数字呢?象这类古老的问题前人早都为我们做好了相应的规范,无规矩不成方圆吗。我们平时所说的浮点数的存储规范,就是由IEEE指定的,具体的规范文件是:IEEE Standard 754 for Binary Floating-Point Arithmetic。大家可以很容易的从网络上下载到这篇文档。

下面,偶就大致的描述一下,感兴趣的“同志”们可以阅读原文。

--------------------------------------------------------

声明:

此文为原创,欢迎转载,转载请保留如下信息

作者:afreez 北京-中关村

联系方式:afreez.gan@https://www.doczj.com/doc/7610636116.html, (欢迎与作者交流)

初次发布时间:2006-12-19

初次发布在: https://www.doczj.com/doc/7610636116.html,/ganxingming/

不经本人同意,不得用语商业或赢利性质目的,否则,作者有权追究相关责任!

---------------------------------------------------------

在c语言中,单精度(float)数据类型为32bits,具体的如下图所示:

整个32bits分三部分,即

Sign:符号位,1 bit,0为正,1为负;

Exponent(bias):指数部分,8 bits,存储格式为移码存储(后面还会说明),偏移量为127;

Mantissa(fraction):尾数部分。

对应的双精度(double)类型的格式为:

同样,64位也被分为了三部分,对照单精度,不用我说就可以理解各个部分的含义了吧?

是不是有点迷糊了,不要怕,理论这个东西最能忽悠人了,看起来很高深,其实也就是个屁大的事,举个例子就很容易明白了。

举例说明,如3.24x103,则对应的部分为,Sign为0,3为指数部分(注意计算机里面存储的不是3,这里仅仅为了说明),3.24为尾数。我们知道,计算机“笨”的要死,只认识0和1,那么到底一个浮点数值在计算机存储介质中是如何存储的呢?

例如,我们要想偷窥浮点类型的值4.25在计算机硬盘中存储的庐山真面目,请跟我来:首先把4.25转换成二进制的表达方式,即100.01,在详细点,变成1.0001x22,好了,对号入座把。

Sign=0;

Exponent(bias)=2+127=129 (偏移量为127,就是直接加上个127了);

Mantissa=1.0001-1.0=0001(规格化后,小数点前总是整数1,全世界人都知道前面是1不是0,所以省略不写了,即尾数部分不包括整数部分;当别人问你,为什么23 bit的尾数部分可以表示24位的精度,知道怎么回答了吧。靠,什么,没有看懂,再仔细读两便就知道了)。

对照上面的图示,相信你已经看明白了吧?相信你的智商。为了加深认识,再来一个。如果给定你一个二进制数字串,01000000100010000000000000000000,并告诉你这是一个float类型的值,让你说出它是老几,知道怎么算了吧?如果不知道,看下面的图,我就不废话解释了。

2.2深入理解浮点存储格式

为了更深入的理解浮点数的格式。我们使用C语言来做一件事。在C语言的世界里,强制类型转换,大家应该都很熟悉了。例如:

float f=4.6;

int i;

i = (int)(f+0.5); // i=5

..

下面我们不使用强制类型转化,我们自己来计算f转换成整形应该等于几?

把主要代码帖出来,如下:

//取23+1位的尾数部分

int ival= ((*(int *)(&fval)) & 0x07fffff) | 0x800000;

// 提取指数部分

int exponent = 150 - (((*(int *)(&fval)) >> 23) & 0xff);

if (exponent < 0)

ival = (ival<< -exponent);

else

ival = (ival >> exponent);

// 如果小于0,则将结果取反

if ((*(int *)&fval) & 0x80000000)

ival = -ival;

C语言float类型浮点数的存储方法

C语言float类型浮点数的存储方法 #include int main(int argc, char *argv[]) { float p = 5.1f; int f = (int)(p*100); printf("%d", f); getch(); return 0; } 我想要输出 510,可是机器居然输出509。 我试着把5.1改成5.5,一切正常。 IEEE规定的浮点数的机器表示: 32位机器的 float 是4字节的,共32位。 第1位是符号位,接着8位指数位,接着23位基数位。 以5.1为例。 5 = 101 (2进制) 0.1 = 0.0 0011 0011 0011 0011 0011 0011 .....(无限循环) 所以 5.1 = 101.0 0011 0011 0011 0011 0011 0011 0011 0011 ... 5.1= 1.010 0011 0011 0011 0011 0011 0011 0011 0011 0011... * 2^2 因为第一位总是为1,如果是0,就移动小数点直到是非0的,所以第一位的1丢弃。得到 010 0011 0011 0011 0011 0011 0011 0011 0011.... 取23位得到 0100 0110 0110 0110 0110 011 接着看指数部分 指数是2, 根据规定,指数统一+127再转换为无符号8位2进制数, 2+127=129 (1000 0001) 存储的时候指数部分存储在基数之前,这样就有31位了, 因为5.1是正的,所以符号为是0,存储在指数部分之前 这样就得到 0100 0000 1010 0011 0011 0011 0011 0011 我们来看一下机器上是否真的如此 #include #include int main(int argc, char *argv[])

浮点数存储

浮点数存储.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

浮点数规格化和教案

第一节 X=(-1)S×(1.M)×2E-127e=E-127 X=(-1)S×(1.M)×2E-1023 e=E-1023 我承认以前对这俩公式避之不及不予深究努力自己说服自己而未能得逞,部分原因是跟“移码与真值的关系”扯上关系,这“移码与真值的关系”想搞清先得把引入移码的充分理由给我个说法,不幸玩过头正事误了。上回说了“补码省心移码悦目”能算是今时不同往日了吧,现在轮到对IEEE754浮点数规格化表示法杀无赦去死吧。 首先,“IEEE规格化形式”是对“传统规格化形式”进一步严格要求来的。 IEEE规格化形式唯一,而浮点数记法多种多样。 (1.75)10=1.11×20 (IEEE规格化表示)=0.111×21 (传统规格化表示) =0.0111×22=0.00111×23 其次,既然IEEE想到对“传统规格化形式”进一步修订当然有目的,你以为作无用功呐,关键目的是什么? 规格化的目的同理。修改阶码同时左右移小数点使尾数域最高有效位固定为1,尾数就以ta所可能变化成的最大形式出现,即使遭遇类似截断的操作仍可保持尽可能高的精度。 有类错误我这种大秀逗极善于犯!就是不理会左右关系不经过大脑直接作问题少女状问很白的问题:“‘移码和真值的关系’是E=27(或210)+X,那X=E-27(或210),在怎么着里面数该是128(或1024),咋是127(或1023)?” 当E=M=全0 E(移码)=全0,对应真值-128 M(补码)=全0,对应真值0 E=M=全0,真值X=0-128=0 结合符号位S 为0或1分正零和负零 当E=全1,M=全0 E(移码)=全1,对应真值+127 M(补码)=全0,对应真值0 E=全1,M=全0,真值X=0127=∞ 结合符号位S 为0或1分+∞和-∞ 要除去表示零和无穷大这2种特殊情况 指数偏移值不选128(10000000),而选127(01111111) 对IEEE32位规格化浮点数 8位移码(隐含1位符号位)原本表示范围是-128 →+127 (除去全1(+127)全0(-128)剩下-127 →+126 ???) 实际可用指数值(即阶码真值)e范围是-126→+127 加上偏移值后,阶码E的范围变为1→254 以10的幂表示,绝对值的范围是10-38→1038 假设由S,E,M三个域组成的一个32位二进制字所表示的非零规格化浮点数x,真值表示为:x=(-1)s×(1.M)×2E-128 它所表示的规格化的最大正数、最小正数、最大负数、最小负数是多少? 第二节 1、什么是IEEE754标准 用来规范化浮点数,其格式是

32位浮点数表示的范围

浮点数的理解 在定点数表示中存在的一个问题是,难以表示数值很大的数据和数值很小的数据。例如,电子的质量(9×10-28克)和太阳的质量(2×1033克)相差甚远,在定点计算机中无法直接表示,因为小数点只能固定在某一个位置上,从而限制了数据的表示范围。 为了表示更大范围的数据,数学上通常采用科学计数法,把数据表示成一个小数乘以一个以10为底的指数。 例如,在计算机中,电子的质量和太阳的质量可以分别取不同的比例因子,以使其数值部分的绝对值小于1,即: 9×10-28=0.9×10-27 2×1033=0.2×1034 这里的比例因子10-27和1034要分别存放在机器的某个单元中,以便以后对计算结果按此比例增大。显然,这要占用一定的存储空间和运算时间。 浮点表示法就是把一个数的有效数字和数的范围在计算机中分别予以表示。这种把数的范围和精度分别表示的方法,相当于数的小数点位置随比例因子的不同而在一定范围内自由浮动,改变指数部分的数值相当于改变小数点的位置。在这种表示法中,小数点的位置是可以浮动的,因此称为浮点表示法。 浮点数的一般表示形式为: 一个十进制数N可以写成:N = 10e×M 一个二进制数N可以写成:N = 2e×M 其中,M称为浮点数的尾数,是一个纯小数;e是比例因子的指数,称为浮点数的指数,是一个整数。在计算机中表示一个浮点数时,一是要给出尾数M,用小数形式表示;二是要给出指数e,用整数形式表示,常称为阶码。尾数部分给出有效数字的位数,因而决定了浮点数的表示精度;阶码部分指明了小数点在数据中的位置,因而决定了浮点数的表示范围。浮点数也是有符号数,带符号的浮点数的表示如图2-2所示。 其中,S为尾数的符号位,放在最高一位;E为阶码,紧跟在符号位之后,占m位;M为尾数,放在低位部分,占n位。 1. 规格化浮点数 若不对浮点数的表示做出明确规定,同一个浮点数的表示就不是惟一的。例如:

计算机中数值的表示

数值型数据由数字组成,表示数量,用于算术操作中。 3.5.1 定点数和浮点数的概念 在计算机中,数值型的数据有两种表示方法,一种叫做定点数,另一种叫做浮点数。 所谓定点数,就是在计算机中所有数的小数点位置固定不变。定点数有两种:定点小数和定点整数。定点小数将小数点固定在最高数据位的左边,因此,它只能表示小于1的纯小数。定点整数将小数点固定在最低数据位的右边,因此定点整数表示的也只是纯整数。由此可见,定点数表示数的范围较小。 为了扩大计算机中数值数据的表示范围,我们将12.34表示为0.1234×102,其中0.1234叫做尾数,10叫做基数,可以在计算机内固定下来。2叫做阶码,若阶码的大小发生变化,则意味着实际数据小数点的移动,我们把这种数据叫做浮点数。由于基数在计算机中固定不变,因此,我们可以用两个定点数分别表示尾数和阶码,从而表示这个浮点数。其中,尾数用定点小数表示,阶码用定点整数表示。 在计算机中,无论是定点数还是浮点数,都有正负之分。在表示数据时,专门有1位或2位表示符号,对单符号位来讲,通常用“1”表示负号;用“0”表示正号。对双符号位而言,则用“11”表示负号;“00”表示正号。通常情况下,符号位都处于数据的最高位。 3.5.2 定点数的表示 一个定点数,在计算机中可用不同的码制来表示,常用的码制有原码、反码和补码三种。不论用什么码制来表示,数据本身的值并不发生变化,数据本身所代表的值叫做真值。下面,我们就来讨论这三种码制的表示方法。 1. 原码 原码的表示方法为:如果真值是正数,则最高位为0,其它位保持不变;如果真值是负数,则最高位为1,其它位保持不变。 【例1】写出13和–13的原码(取8位码长) 解:因为13=(1101)2,所以13的原码是00001101,-13的原码是10001101。 采用原码,优点是转换非常简单,只要根据正负号将最高位置0或1即可。但原码表示在进行加减运算时很不方便,符号位不能参与运算,并且0的原码有两种表示方法:+0的原码是00000000,-0的原码是10000000。 2. 反码 反码的表示方法为:如果真值是正数,则最高位为0,其它位保持不变;如果真值是负数,则最高位为1,其它位按位求反。 【例2】写出13和–13的反码(取8位码长) 解:因为13=(1101)2,所以13的反码是00001101,-13的反码是11110010。 反码跟原码相比较,符号位虽然可以作为数值参与运算,但计算完后,仍需要根据符号位进行调整。另外0的反码同样也有两种表示方法:+0的反码是00000000,-0的反码是11111111。为了克服原码和反码的上述缺点,人们又引进了补码表示法。补码的作用在于能把减法运算化成加法运算,现代计算机中一般采用补码来表示定点数。 3. 补码 补码的表示方法为:若真值是正数,则最高位为0,其它位保持不变;若真值是负数,则最高位为1,其它位按位求反后再加1。 【例3】写出13和–13的补码(取8位码长) 解:因为13=(1101)2,所以13的补码是00001101,-13的补码是11110011。

2.浮点数的存储原理

问题:long和float类型都是四个字节,为什么存储数值的范围相差极大? 原因:因为两者的存储原理时不同的。 浮点数的存储原理 作者: jillzhang 联系方式:jillzhang@https://www.doczj.com/doc/7610636116.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”加上正号或负号即可。

浮点数的表示和基本运算

浮点数的表示和基本运算 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 S P M 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M表示公式偏移量 1823(-1)S*2(P-127)*1.M127 11152(-1)S*2(P-1023)*1.M1023 以单精度浮点数为例,可以得到其二进制的表示格式如下 S(第31位)P(30位到 23位) M(22位到 0位) 其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.) 为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。 2 浮点数的表示约定 单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。 (1) 当P = 0, M = 0时,表示0。 (2) 当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。

(3) 当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。 当我们使用.Net Framework的时候,我们通常会用到下面三个常量 Console.WriteLine(float.MaxValue); // 3.402823E+38 Console.WriteLine(float.MinValue); //-3.402823E+38 Console.WriteLine(float.Epsilon); // 1.401298E-45 //如果我们把它们转换成双精度类型,它们的值如下 Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢? 根据上面的约定,我们可以知道阶码P的最大值是11111110(这个值是254,因为255用于特殊的约定,那么对于可以精确表示的数来说,254就是最大的阶码了)。尾数的最大值是11111111111111111111111。 那么这个最大值就是:0 11111110 11111111111111111111111。 也就是 2(254-127) * (1.11111111111111111111111)2 = 2127 * (1+1-2-23) = 3.40282346638529E+38 从上面的双精度表示可以看出,两者是一致的。最小的数自然就是- 3.40282346638529E+38。 对于最接近于0的数,根据IEEE754的约定,为了扩大对0值附近数据的表示能力,取阶码P = -126,尾数 M = (0.00000000000000000000001)2 。此时该数的二进制表示为:0 00000000 00000000000000000000001 也就是2-126 * 2-23 = 2-149 = 1.40129846432482E-45。这个数字和上面的Epsilon 是一致的。 如果我们要精确表示最接近于0的数字,它应该是 0 00000001 00000000000000000000000 也就是:2-126 * (1+0) = 1.17549435082229E-38。 3 浮点数的精度问题 浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似

浮点数的表示和运算(范围计算)

浮点数的表示和运算 浮点数的表示和基本运算 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 以单精度浮点数为例,可以得到其二进制的表示格式如下 其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.) 为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。 2 浮点数的表示约定 单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。 (1)当P = 0, M = 0时,表示0。 (2)当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。 (3)当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。 当我们使用.Net Framework的时候,我们通常会用到下面三个常量 Console.WriteLine(float.MaxValue); // 3.402823E+38 Console.WriteLine(float.MinValue); //-3.402823E+38 Console.WriteLine(float.Epsilon); // 1.401298E-45 //如果我们把它们转换成双精度类型,它们的值如下 Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢?

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

浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个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转换为二进制形式

单双精度浮点数的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.浮点数表达方式 我们知道任何一个R 进制数N 均可用下面的形式表示:N R =±S ×R ±e 其中,S—尾数,代表N 的有效数字; R—基值,通常取2、8、16;e—阶码,代表N 的小数点的实际位置(相当于数学中的指数)。 比如一个十进制数的浮点表达1.2345×102,其中1.2345为尾数,10为基数,2为阶码。一个二进制数的浮点表达0.001001×25,0.001001为尾数,2为基数,5为阶码;同时0.001001×25也可以表示成0.100100×23,0.100100为尾数,2为基数,3为阶码。浮点数就是利用阶码e 的变化达到浮动小数点的效果,从而灵活地表达更大范围的实数。 2.浮点数的规格化 一个数用浮点表示时,存在两个问题:一是如何尽可能多得保留有效数字;二是如何保证浮点表示的唯一。 对于数0.001001×25,可以表示成0.100100×23、0.00001001×27等等,所以对于同一个数,浮点有多种表示(也就是不能唯一表示)。另外,如果规定尾数的位数为6位,则0.00001001×27会丢掉有效数字,变成0.000010×27。因此在计算机中,浮点数通常采用规格化表示方法。 当浮点数的基数R 为2,即采用二进制数时,规格化尾数的定义为:1/2<=|S|<1。若尾数采用原码(1位符号位+n 位数值)表示,[S]原=S f S 1S 2S 3…S n (S f 为符号位的数符),则满足S 1=1的数称为规格化数。即当尾数的最高有效位S 1=1,[S]原=S f 1S 2S 3…S n ,表示该浮点数为规格化数。对0.001001×25进行规格化后,表示为0.100100×23。 3.浮点数的表示范围 求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

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

浮点数在计算机内存中的存储格式 对于浮点类型的数据采用单精度类型(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;

浮点数1

浮点数在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。 浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。 一个浮点数a由两个数m和e来表示:a = m × be。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。 这种设计可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。 例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0.0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和43210)。当然,实际使用的位数通常远大于4。 此外,浮点数表示法通常还包括一些特别的数值:+∞和?∞(正负无穷大)以及NaN('Not a Number')。无穷大用于数太大而无法表示的时候,NaN则指示非法操作或者无法定义的结果。 大部份计算机采用二进制(b=2)的表示方法。位(bit)是衡量浮点数所需存储空间的单位,通常为32位或64位,分别被叫作单精度和双精度。有一些计算机提供更大的浮点数,例如英特尔公司的浮点运算单元Intel8087协处理器(以及其被集成进x86处理器中的后代产品)提供80位长的浮点数,用于存储浮点运算的中间结果。还有一些系统提供128位的浮点数 浮点数的表示 在实际应用中,往往会使用实数,例如下面的一些十进制实数: 179.2356=0.1792356x10^3 0.000000001=0.1x10^8 3155760000=0.215576x10^6 很明显,上述第一个数既有整数也有小数,不能用定点数格式化直接表示,后两个数则可能超出了定点数的表示范围,所以计算机引入了类似与科学表示法来标示实数。 (1)典型的浮点数格式 在机器中,典型的浮点数格式如图所示 浮点数代码由两部分组成:阶码E和尾数M。浮点数真值为: N=+/-(R^E)xM R是阶码的底。在机器中一般规定R为2,4,8或16,与尾数的基数相同。例如尾数为二进制,则R也为2。同一种机器的R值是固定不变的,所以不需要在浮点数代码中表示出来,他是隐含约定的。因此,机器中的浮点数只需表示出阶码和尾数部分。 E是阶码,即指数值,为带符号整数,常用移码或补码表示。 M是尾数,通常是纯小数,常用原码或补码表示。

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示范围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示范围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

计算机组成原理-浮点数表述范围

以32位的浮点数为例 浮点数有一般的格式和IEEE754的格式两种。 一般的格式符合2进制数机器码(包括定点整数和定点小数)的规定规则 IEEE表示则是为了实现上的方便,做了一些约定的格式改变。 先说说问题的描述方式: 1、一个32位的二进制数来表示的浮点数。都是由阶和尾数两部分组成。阶和尾数都带有一位符号位,分别称为阶符和数符。 2、从图例表示可以有两种方式: (1)一种是阶和尾数分别带着符号位表示,依次为阶符(ES)、阶(E)、数符(MS)和尾数(M) (2)另一种是把数符提前到整个浮点数的最前面,表示整个浮点数的符号位,标记为S。 这两种表示方式是一致的。前者比较直接明了地分隔成“阶”(包括阶符和阶)和“尾数”(包括数符和尾数)两部分;后者则是为了便于软件移植的格式。 比较流行的教材的新版本都倾向于使用后一种表示方式。 因此,下面开始,我们都采用后一种方式叙述。

3、从真值的表示方式来说有多种不同的情况 符号位统一都是:(-1)s 一般表示法的阶:e=E-128(完全符合机器码的移码规则)。该部分在真值中表示为2E-128,注意,E为带符号位的阶所表示的无符号数大小。比如8位阶(包含一位符号位),以移码表示,以11111111为例,E=255,而e=127,在真值中表示为2127。 IEEE表示法的阶:e=E-127(是IEEE的一个约定,不符合机器码的移码规则)。该部分在真值中表示为2E-127,注意,E为带符号位的阶所表示的无符号数大小。比如8位阶(包含一位符号位),以移码表示,以11111111为例,E=255,而e=128,在真值中表示为2128。 一般表示法的尾数:M,该部分在真值中以M表示,规划化处理是使得M 的最高位和符号位不同值,或者说用异或判断结果为1(其本质在于使得该数值的绝对值≥0.5)。 IEEE表示法的尾数:1.M,该部分在真值中以1.M表示,因为IEEE表示方式本来就是一种标准格式,所以不存在不是规格化的数。其中尾数域的小数点前约定的那个1不予存储,默认其隐藏在小数点的左边。 因此,一般表示法和IEEE表示法就可以组成四种组合真值表示。 (1)纯一般表示法(阶和尾数都是一般表示法)真值表示为:(-1)s?M?2E-128 (2)纯IEEE表示法(阶和尾数都是IEEE表示法)真值表示为:(-1)s?(1.M)?2E-127 (3)混合表示法A(阶位一般表示法,尾数都是IEEE表示法)真值表示为:(-1)s?(1.M)?2E-128,课本例9就是用了这种混合表示法。 (2) 混合表示法B(阶位IEEE表示法,尾数都是一般表示法)真值表示为:(-1)s?M?2E-127 注意:如果题目没有做明确描述。就默认其采用的是“纯一般表示法”。 弄清楚问题的描述方式后,我们来看看各种表示方法的表数范围。 分别从一般表示法的阶和尾数,IEEE的阶和尾数,4个组成部分来分析。

相关主题
文本预览
相关文档 最新文档