计算机进行小数运算时出错的原因

由于计算机内部所有的信息都是以二进制数的形式来处理的,因此,在这一点上,整数和小数并无差别。不过,使用二进制数来表示整数和小数的方法却有很大的不同。
计算机之所以会出现运算错误,是因为“有一些十进制数的小数无法转换成二进制数”。实际上,十进制数的0.1转换成二进制后会变成0.00011001100…(1100循环)这样的循环小数。这和无法用十进制来表示1/3是一样的道理。1/3就是0.3333…,同样是循环小数。这样大家应该明白了,为什么用代码的程序无法得到正确的结果。因为无法正确表示的数值,最后都变成了近似值。计算机这个功能有限的机械设备是无法处理无限循环的小数的。因此,在遇到循环小数时,计算机就会根据变量数据类型所对应的长度将数值从中间截断或者四舍五入。
很多编程语言中都提供了两种表示,小数的数据类型分别是双精度浮点数和单精度浮点数。双精度浮点数类型用64位单精度浮点数类型用32位来表示全体小数。在C语言中,双精度浮点数类型和单精度浮点数类型分别用double和float来表示。不过,这些数据类型都采用浮点数来表示小数。浮点数是指用浮号、尾数、基数和指数这四部分来表示的小数。因为计算机内部使用的是二进制数,所以基数自然就是2。因此,实际的数据中往往不考虑基数,只用符号、尾数、指数这三部分即可表示浮点数。也就是说,64位(双精度浮点数)和32位(单精度浮点数)的数据会被分为三部分来使用。双精度浮点数和单精度浮点数在表示同一数值时使用的位数不同。此外,双精度浮点数能表示的数值范围要大于单精度浮点数。符号部分是指使用一个数据位来表示数值的符号。该数据位是1时表示负,为0时则表示“正或者0”。尾数部分和指数部分并不只是单单存储的用整数表示的二进制数。尾数部分用的是“将小数点前面的值固定为1的正则表达式”,而指数部分用的则是“EXCESS系统表现”。
尾数部分,使用正则表达式可以将表现形式多样的浮点数统一为一种表现形式。在二进制数中,我们使用的是“将小数点前面的值固定为1的正则表达式”。具体来讲,就是将二进制数表示的小数左移或者右移(这里是逻辑移位。因为符号位是独立的)数词后整数部分的第一位变为1,第二位变为0(这样是为了消除第2位以上的数位)。而且第1位的1在实际的数据中不保存。由于第1位必须是1,因此,省略该部分后节省了一个数据位,从而也就可以表示更多的数据范围(虽不算太多)。EXCESS系统表现是指通过将指数部分表示范围的中间值设为0,使得负数不需要符号来表示。
计算机计算出错的原因之一是,采用浮点数来处理小数(另外,也有因“位溢出”而造成计算错误的情况)。下面介绍两种,避免该问题的方法:首先是回避策略,即无视这些错误;另一个策略是把小数转换成整数来计算。除此之外,BCD也是一种使用二进制表示十进制的方法。

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