《程序是怎样跑起来的》第三章——计算机进行小数运算时出错的原因?
本章的学习之前,有几个问题很不错,是我从未想过的:
-
二进制数0.1,用十进制数表示的话是多少?
-
用小数点后有3位的二进制数,能表示十进制数0.625吗?
-
将小数分为符号、尾数、基数、指数4部分进行表现的形式称为什么?
-
二进制数的基数是多少?
-
.通过把0作为数值范围的中间值,从而在不使用符号位的情况下来表示负数的表示方法称为什么?
-
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标准中,浮点数由三个部分组成(二进制基数为二,就不再提):
-
符号位(Sign bit):符号位是指用一个数据位来表示数值的符号,用于表示正负数,0表示正数,1表示负数。
-
指数位(Exponent):使用EXCESS 系统表现(通过将指数部分表示范围的中间值设为0,使得负数不需要用符号来表示),用于表示数值的数量级。对于单精度浮点数,有8位指数位;对于双精度浮点数,有11位指数位。
-
尾数位(Mantissa):用于表示数值的精度(尾数部分使用正则表达式,将多种形式的浮点数统一为一种形式,方便计算机处理)。对于单精度浮点数,有23位尾数位;对于双精度浮点数,有52位尾数位。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!