浮点数存储问题

我们说的浮点数包括单精度浮点数和双精度浮点数。
这里,我先拿单精度浮点数来解释你的问题。

单精度数,是指计算机表达实数近似值的一种方式。VB中,Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38 。
单精度存储格式
    符号位S(sign) - 1bit
    0代表正号,1代表负号。

    指数位E(exponent) - 8bit
    E的取值范围为0-255(无符号整数),实际数值e=E-127。
    有时E也称为“移码”,或不恰当的称为“阶码”(阶码实际应为e) 就是你所说的p。

    尾数位M(mantissa) - 23bit
    M也叫有效数字位(sinificand)、系数位(coefficient), 甚至被称作“小数”。
    在一般情况下,m=(1.M)2,使得实际起作用范围为1≤尾数<2。
    为了对溢出进行处理,以及扩展对接近0的极小数值的处理能力。

单精度浮点数实例:
对于内部存储数据(00111111 01100110 01100110 01100110)2:
     符号位
    (最左侧)S=0。这表示是个正数

     指数
    (左侧第2-9位)E=(01111110)2=(126)10,所以s=S-127=-1。

     尾数
    (最后的23位)M=(1100110 01100110 01100110)2,m=(1.M)2=(1.7999999523162841796875)10
    该二进制小数转为10进制的计算方式为1 + (1/2+1/4) + (1/32+1/64) + (1/512+1/1024)……
   
    实际值
    N=1.7999999523162841796875*2-1=0.89999997615814208984375
(其实,这个数据是0.9的单精度浮点数的实际内部存储,可以看到有一定的误差)

单精度浮点数的表示范围及说明
    表示范围
    最大表示范围:单精度浮点数可以表示的范围为±3.40282 * 1038(1.1111...12*2127)
    接近于0的最小值:单精度浮点数可以表示1.175 * 10-38(1.00...02*2-126)的数据而不损失精度。
    当数值比以上值小的时候,将会由于尾数的有效位数减少而逐步丧失精度(IEEE 754的规定),或者有的系统则直接采用0值来简化处理过程。

    精度
    单精度浮点数的实际有效精度为24位二进制,这相当于 24*log102≈7.2 位10进制的精度,所以平时我们说“单精度浮点数具有7位精度”。(精度的理解:当从1.000...02变化为1.000...12时,变动范围为2-23,考虑到因为四舍五入而得到的1倍精度提高,所以单精度浮点数可以反映2-24的数值变化,即24位二进制精度) 

    误差
    浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。
    特定精度下看似相等的两个浮点数可能并不相等,因为它们的最小有效位数不同。
    由于浮点数可能无法精确近似于十进制数,如果使用十进制数,则使用浮点数的数学或比较运算可能不会产生相同的结果。
    如果涉及浮点数,值可能不往返。值的往返是指,某个运算将原始浮点数转换为另一种格式,而反向运算又将转换后的格式转换回浮点数,且最终浮点数与原始浮点数相等。由于一个或多个最低有效位可能在转换中丢失或更改,往返可能会失败。

关于双精度型:
  目前大多数高级语言(包括C)都按照IEEE-754标准来规定浮点数的存储格式,IEEE754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储,分为三个部分:符号位、阶和尾数。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位,符号位1位,双精度则为11为阶,53位尾数和1位符号位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值