关于float精度

关于float精度计算机是怎么存小数的? 1000.101 这种二进制小数是「定点数」形式,代表着小数点是定死的,不能移动,如果你移动了它的小数点,这个数就变了, 就不再是它原来的值了。 然而,计算机并不是这样存储的小数的,计算机存储小数的采用的是浮点数,名字里的「浮点」表示小数点是可以浮动的,比如&#16

 

计算机是怎么存小数的?

1000.101 这种二进制小数是「定点数」形式,代表着小数点是定死的,不能移动,如果你移动了它的小数点,这个数就变了, 就不再是它原来的值了。

然而,计算机并不是这样存储的小数的,计算机存储小数的采用的是浮点数,名字里的「浮点」表示小数点是可以浮动的,比如 1000.101 这个二进制数,可以表示成 1.000101 x 2^(-3),类似于数学上的科学记数法。

既然提到了科学计数法,我再帮大家复习一下,比如有个很大的十进制数 1230000,我们可以也可以表示成 1.23 x 10^6,这种方式就称为科学记数法,该方法在小数点左边只有一个数字,而且把这种整数部分没有前导 0 的数字称为规格化,比如 1.0 x 10^(-9) 是规格化的科学记数法,而 0.1 x 10^(-9) 和 10.0 x 10^(-9) 就不是了。

因此,如果二进制要用到科学记数法,同时要规范化,那么不仅要保证基数为 2,还要保证小数点左侧只有 1 位,而且必须为 1,所以通常将 1000.101 这种二进制数,表示成 1.000101 x 2^(-3),其中,最为关键的是 000101 和 -3 这两个东西,它就可以包含了这个二进制小数的所有信息,000101 称为尾数,即小数点后面的数字,-3 称为指数,指定了小数点在数据中的位置。

现在绝大多数计算机使用的浮点数,一般采用的是 IEEE 制定的国际标准,这种标准形式如下图:

Image

这三个重要部分的意义如下:

  • 符号位:表示数字是正数还是负数,为 0 表示正数,为 1 表示负数;

  • 指数位:指定了小数点在数据中的位置,指数可以是负数,也可以是正数,指数位的长度越长则数值的表达范围就越大;

  • 尾数位:小数点右侧的数字,也就是小数部分,比如二进制 1.0011 x 2^(-2),尾数部分就是 0011,而且尾数的长度决定了这个数的精度,因此如果要表示精度更高的小数,则就要提高尾数位的长度;

用 32 位来表示的浮点数,则称为单精度浮点数,也就是我们编程语言中的 float 变量,而用 64 位来表示的浮点数,称为双精度浮点数,也就是 double 变量,它们的结构如下:

Image

 

以上引用部分主要来自参考资料1,该参考资料中还有很多有用的相关知识,可以移步学习。

 float 的尾数部分是 23 位,同时都带有一个固定隐含位(规定必须为1),故float一共24个二进制有效位。将24个二进制有效位都看作无符号正整数A,则当8 388 608=2^23≤A<10 000 000, A需要7位十进制才可表示,而不确定位最坏的情况下会影响到第7位,所以至少能保证6位有效数字是确定的;当10 000 000≤A≤ 2^24-1=16 777 215时,A需要8位十进制才可表示,而不确定位最坏的情况下会影响到第8位,所以至少能保证7位有效数字是确定的。

 double 的尾数部分是 52 位,同时都带有一个固定隐含位(规定必须为1),故float一共53个二进制有效位。将53个二进制有效位都看作无符号正整数A,因为某16位数=2^52≤A≤ 2^53-1=某16位数, 故A需要16位十进制才可表示,而不确定位最坏的情况下会影响到第16位,所以至少能保证15位有效数字是确定的。

因此,float最低能保证6个有效位,double最低能保证15个有效位。当然最低能保证,不代表超出的位数就不准确:(1)float中,当10 000 000≤A≤ 2^24-1=16 777 215时,则相应的float最低能保证7个有效位。(2)不确定位不一定确实对末位(尾数区的最右边一位)产生了不确定性影响;甚至末位更后的位的值也可能是准确的。

 

参考资料:

1. https://blog.csdn.net/flynetcn/article/details/115741534?spm=1001.2014.3001.5506

2. ieee 定义中如何解释 float 精度为6到7位? – BlueWanderer的回答 – 知乎 https://www.zhihu.com/question/479335091/answer/2065860323

今天的文章关于float精度分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/55211.html

(0)
编程小号编程小号
上一篇 2023-08-28
下一篇 2023-08-28

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注