浮点数的历史
浮点数表示的有理数进行编码。它对执行涉及非常大的数字,非常接近0的数字,以及作为实数运算的近似值的计算,都有着非常大的作用。
直到20世纪80年代,每个计算机的制造商都制造出了自己的浮点数规则,以及对浮点数执行运算的细节。另外,他们常常不会关注于浮点数计算的准确性,而把实现的快速和简便看得比精确性更重要。
大约在1985年,这些情况随着IEEE标准754的推出而改变了,这是一个仔细制定的表示浮点数及其运算的标准。这项工作是从1976年开始由Inter赞助的,与8087的设计同时执行,8087是一种8086提供浮点数支持的芯片。是由William Kahan作为顾问制定的,Kahan加入了一个IEEE资助的制定工业标准的委员会。最终Inter选用了无比接近Kahan标准作为了自己浮点数的标准。
IEEE(电气和电子工程师协会)是一个包括所有电子和计算机技术的专业团体。它出版刊物,举办会议,并且建立委员会来定义标准,内容涉及从电力传输到软件工程。另一个IEEE标准的例子是无线网络的802.11标准。
目录
- 二进制的小数
- IEEE浮点数表示
- 数字示例
- 舍入
- 浮点运算
- C语言中的浮点数
- 小结
二进制的小数
形如,b的取值范围是0和1,这种表示方法下数b的定义如下:
例如101.11表示数4+1+0.5+0.25=5.75
将小数点向左移1位,意味着将数除以2,将小数点向右移一位,表示将数乘2。
IEEE浮点数表示
上面我们谈到的定点表示法,不能很有效的表示数字。比如说,我们要表示5*2^100是101后面跟随100个0的位模式来表示的,这样是很不便的。相反,我们希望能够给定x和y来表示x*2^y。
IEEE浮点数标准用的形式来表达一个数。
- 符号 s决定这数是负数(s=1),还是正数(s=0),而对于数值0的符号位解释作为特殊情况来处理。
- 尾数 M是一个二进制小数,它的范围是1~2-ε,或者是0~1-ε
- 阶码 E的作用是对浮点数加权,这个权重是2^E
将浮点数的位表示划分为3个字段,分别对这些字段进行编码:
- 一个单独的符号位s直接编码符号s
- k位的阶码字段exp=编码阶码E
- n位的小数字段frac=编码尾数M,但是编码出来的值也依赖于阶码的值是否等于0
对于单精度的浮点数,s,exp,frac三段分别为1位&