详解二进制浮点数
发布网友
发布时间:2024-09-09 15:13
我来回答
共1个回答
热心网友
时间:2024-10-25 20:11
十进制的科学计数法大家都熟悉,实数可以用如下形式表示:
浮点数在计算机中以二进制科学计数法存储,单精度占用32位,双精度占用64位。以下以64位双精度浮点数为例。
最高位是符号位(sign),0代表正数,1代表负数。接下来的11位是指数(exponent),最后52位是小数(fraction)。浮点数值可用以下公式计算,类似于十进制的科学计数法。
需要注意的是,exponent和fraction不是直接存储的。
实际上,62位到52位存储的是c,长度为11位,所以c可以表示10进制[公式]区间内的整数,0和2047有特殊含义。1023是64位浮点数的指数偏移量(exponent bias),32位浮点数的偏移量是127。在这里[公式]可以表示[公式]区间内的整数。不考虑c=0和2047的情况,指数exponent的取值范围是[公式]。
因为要保证[公式],小数点前的数字总是1,所以不用存储,51位到0位存储的值称为尾数(mantissa),是用二进制表示的小数点后的数字。如果不熟悉如何用二进制表示小数,请自行百度。这里写作m,从高位到低位写作[公式],m转成十进制的值可以用以下公式算出:[公式]
所以m的取值范围是[公式],小数fraction的取值范围是[公式]。
当[公式]时,双精度浮点数达到可以表示的最大正数[公式]。
当[公式]时,双精度浮点数达到可以表示的最小正数[公式]。
负数的情况相同。
上面说到c=0和2047有特殊含义,有以下4种情况:
浮点数不能表示所有实数,比如1.375可以被精确表示,因为[公式]。但是在例1中,1.4和1.1两个数都不能被精确表示,用[4]的链接可以将浮点数字面量转换成真实存储的值,可以看到1.4被近似成了1.399999999999999,1.1被近似成了1.10000000000000008,所以两数相减得到的不是0.3而是0.2999999999999998。
两个双精度数之间的最小相对误差是[公式],所以只能保证15位有效数字,第16位只是部分精确。单精度只能保证6位有效数字,第7位部分精确。所以在例2中[公式],恰巧第16位有效数字是部分精确的,4可以被精确表示,但是[公式],因为最后一位并不能表示5,所以出现了浮点数误差。[公式]的结果中的4已经在第17位,超出了双精度浮点数的最大有效位数,就被忽略了,所以有[公式]。