《程序是怎样跑起来的》第三章——计算机进行小数运算时出错的原因?

本章的学习之前,有几个问题很不错,是我从未想过的:

  1. 二进制数0.1,用十进制数表示的话是多少?

  2. 用小数点后有3位的二进制数,能表示十进制数0.625吗?

  3. 将小数分为符号、尾数、基数、指数4部分进行表现的形式称为什么?

  4. 二进制数的基数是多少?

  5. .通过把0作为数值范围的中间值,从而在不使用符号位的情况下来表示负数的表示方法称为什么?

  6. 10101100.01010011 这个二进制数,用十六进制表示的话是多少?

这四个问题的答案分别为

  • 0.5

  • 能表示

  • 浮点数(浮点数形式)

  • 2

  • EXCESS 系统表现

  • AC.53

通常计算计算出来的结果是毋庸置疑的,因为计算机计算的精度比人计算的精度要高太多了。本章却告诉我们计算机也是会出错的!例如:将0.1累加100次的结果是多少?显而易见的答案为10。但计算机运行输出过后却是10.000002。这是为何?
经过了解,因为计算机内部是使用二进制运行的,整数和小数二进制有很大的差别,而且有一些十进制的小数无法转换为二进制数。所以结果才是10.000002。(小数点后四位用二进制表示是的数值范围为0.0000~0.1111。)

 如图所示,十进制的下一位是0.625.因此,这中间的小数就无法用二进制来表示。此外,实际上0.1这个数转换为二进制后会变成0.00011001100......这样的循环小数。这和1/3就是0.33333......一样,是循环小数。
而且带有小数的二进制数,例如1010.1010,这完全就是书面书写的形式,计算机内部是无法使用的,计算机内部处理小数时,通常使用浮点数表示法。最常用的浮点数表示法是IEEE 754标准,它定义了单精度(32位)和双精度(64位)浮点数的存储和运算规则。所以就有了各大编程语言中,我们熟悉的浮点数,浮点数指用符号、尾数、基数、和指数这四部分来表示的数:

 
在IEEE 754标准中,浮点数由三个部分组成(二进制基数为二,就不再提):

  1. 符号位(Sign bit):符号位是指用一个数据位来表示数值的符号,用于表示正负数,0表示正数,1表示负数。

  2. 指数位(Exponent):使用EXCESS 系统表现(通过将指数部分表示范围的中间值设为0,使得负数不需要用符号来表示),用于表示数值的数量级。对于单精度浮点数,有8位指数位;对于双精度浮点数,有11位指数位。

  3. 尾数位(Mantissa):用于表示数值的精度(尾数部分使用正则表达式,将多种形式的浮点数统一为一种形式,方便计算机处理)。对于单精度浮点数,有23位尾数位;对于双精度浮点数,有52位尾数位。


 另外,计算机出错的原因之一就是用浮点数来处理小数(也会有位溢出而造成计算错误的情况),那么如何避免这两种错误呢?一是直接无视掉,因为计算机的精度很高,如果是如特别严苛的计算要求结果,这些微小的误差完全可以忽略。二是将小数转换为整数来计算,计算机在进行小数运算是可能会出现错误,但在进行整数运算时一定不会出错。

 补充:二进制和十六进制的关系:在数值的开头加上0x表示十六进制数,十六进制共32位。

 

posted @   琦q  阅读(28)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示