深入浅出浮点数

1.浮点数描述

 

浮点数,通俗的讲就是显示格式具有小数点的数,如1.234、1234.0(十进制形式)。计算机中浮点数会按照某一处理标准存储在单元中(如IEEE 754标准),其复杂度远大于其它类型的数据。

 

通常对于要么很大或很小的浮点数,难以用十进制形式方便地编写,则使用科学记数法来表示:即由一个有效数字(尾数mantissa)和幂数(exponent)组合而成,通常是乘以基数为10的整数次指数得到。

 

 

其中尾数应满足1≤|mantissa|≤10(通过调整10的指数大小使得mantissa的绝对值至少为1但小于10)。如STEP 7-MicroWIN SMART中浮点数0.00001234显示为1.234E-05:

 

 

如一个电子的质量大约是0.000 000 000 000 000 000 000 000 000 000 910 938 356  kg。如果用一般的方法,将所有位数都写出来,很难直接确知它的大小,还会浪费很多空间。但使用科学记数法,写为9.109 383 56 × 10-31  kg,相对要简单得多,数的数量级、精确度和数值都一目了然。

 

有效数字:指科学计算中用以表示一个浮点数精度的那些数字。一般地,指一个用小数形式表示的浮点数中,从第一个非零的数字算起的所有数字。如1.24和0.00124的有效数字都有3位。包含小数点的数中,结尾的零是有效的。例如 12.2300 有六位有效数字(1、2、2、3、0、0)。

 

2.IEEE二进制浮点数算术标准(IEEE 754)

 

该标准定义了五种基本格式,有三种二进制浮点基本格式(用32,64或128位编码)和两种十进制浮点基本格式(用64或128位编码)。如PLC中常使用的单精度二进制浮点格式:binary32,双精度二进制浮点格式:binary64。

 

一个浮点数 (Value) 可以这样表示:

 

 

也就是浮点数的实际值,等于符号位(sign bit)乘以指数偏移值(exponent bias)再乘以有效数(significand)。

 

 

二进制浮点数是以符号数值表示法的格式存储:最高有效位被指定为符号位(sign bit);“指数部分”即次高有效的e个比特存储指数部分;最后剩下的f个低有效位的比特,存储“有效数”(significand)的小数部分(fraction)。

 

单精度浮点格式

 

在IEEE 754中定义单精度浮点数格式是一种:在计算机存储器中占用4个字节(32 bits),利用“浮点”(浮动小数点)的方法,表示一个范围很大的数值,称为binary32格式。

 

0.15625二进制存储值

 

标准规定binary32具有:

  • 符号位:1位(0代表正,1代表负)

  • 指数存储宽度:8位

  • 有效数存储宽度:23位(真有效数包括二进制点右侧的23个分数位(及真有效数的小数部分)和值为1的隐式前导位(位于二进制点的左侧,及真有效数的整数部分)。因此,只有23 个小数位的有效位被存储,但总精度是24位)

 

 

单精度浮点数的指数域是8位,存储值为0~255。标准规定固定偏移值是28-1-1=128-1=127,则单精度浮点数的指数部分实际取值是从0-127=-127到255-127=128(-127和128被用作特殊值处理,包括“非规约形式的浮点数”和“特殊值”)。

采用指数的实际值加上固定的偏移值的办法(指数偏移)表示浮点数的指数,好处是可以用长度为e个比特的无符号整数来表示所有的指数取值,这使得两个浮点数的指数大小的比较更为容易,因为非负数的比较完全可以从最高有效位遍历比较。

 

以上面的0.15625二进制存储值为例转为浮点数(Value):

 

 

规约形式的浮点数

 

 

如果浮点数中指数部分的编码值在0<exponent≤2e-2之间(单精度浮点数e=8),那么这个浮点数称为规约形式的浮点数(Normalized finite numbers)。

 

最小正规约浮点数:

0 00000001 000000000000000000000002 = 0080 000016 = 2 -126≈1.1754943508×10 -38 

最大正规约浮点数:

0 11111110 111111111111111111111112 = 7f7f ffff16 = 2 127 ×(2 - 2 -23)≈3.4028234664×10 38

 

非规约形式的浮点数

 

如果浮点数的指数部分的编码值是0(因为非规格数的指数是固定的exponent = 2-126,于是也就不用存储指数,因此编码值全为0,这也方便和规约形式的浮点数分开),分数部分非零,那么这个浮点数将被称为非规约形式的浮点数(Denormalized finite numbers)。

 

 

一般是某个数字非常接近零时才会使用非规约型式来表示。其绝对值已经小于所有的规约浮点数的绝对值,即所有的非规约浮点数比规约浮点数更接近0,即上图GAP范围内的数。对于规约浮点数,其有效数(significand=1+fraction)大于等于1且小于2(因为隐式前导位为1),而非规约浮点数的有效数(significand=fraction)小于1且大于0(因为隐式前导位为0)。

 

如STEP 7-MicroWIN SMART,从手册中给出的数值范围可知,S7-200 SMART PLC无法处理非规约形式的浮点数

 

 

值2#0000_0000_0011_0000_0000_0000_0000_0000,对应非规约形式的浮点数为4.408104E-039,其显示为NAN(作为溢出处理)。

 

 

对于WINCC,可以处理非规约形式的浮点数,这一点要了解。

 

 

 

特殊值

除了规约和非规约数,还包括一些特殊值:

  • 如果指数 = 0并且尾数的小数部分是0,这个数为±0(和符号位相关)

  • 如果指数 = 2e-1并且尾数的小数部分是0,这个数是±∞(同样和符号位相关),如STEP 7-MicroWIN SMART中显示为±INF。

  • 如果指数 = 2e-1并且尾数的小数部分非0,这个数表示为一个非法数(NaN)。

 

精度

任何数据的存储长度是有限的,单精和双精浮点数的有效数字分别是有存储的23和52个位,加上最左边没有存储的1个隐式前导位,即是24和53个位。

 

由以上计算得出,单精和双精浮点数可以保证7位和15位十进制有效数字。对于超出可表示精度的将舍入。

舍入

任何有效数上的运算结果,通常都存放在较长的寄存器中,当结果被放回浮点格式时,必须将多出来的比特丢弃。 有多种方法可以用来运行舍入作业,实际上IEEE标准列出4种不同的方法:

  • 舍入到最接近:舍入到最接近,在一样接近的情况下偶数优先(Ties To Even,这是默认的舍入方式):会将结果舍入为最接近且可以表示的值,但是当存在两个数一样接近的时候,则取其中的偶数(在二进制中是以0结尾的)。

  • 朝+∞方向舍入:会将结果朝正无限大的方向舍入。

  • 朝-∞方向舍入:会将结果朝负无限大的方向舍入。

  • 朝0方向舍入:会将结果朝0的方向舍入。

  •  

  • 更多精彩内容,可关注本人微信公众号scadafaq

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

njrobin

来根Banana~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值