三:计算机进行小数运算时出错的原因
Posted 神一样的孩子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三:计算机进行小数运算时出错的原因相关的知识,希望对你有一定的参考价值。
0、开篇:
1、将0.1累加100次也得不到10
2、用二进制数表示小数
先来一个热身,把1011.0011这个有小数点的二进制数转换成十进制数(前面章节已经讲过了用二进制来表示整数的方法,其实小数也一样),如下图所示:
3、计算机运算出错的原因
通过第2节的学习,大家应该也能大概知道计算机运算出错的原因了:是因为“有一些十进制数的小数无法转换成二进制数”。例如十进制数0.1,就无法用二进制数正确表示,小数点后面即使有几百位也无法表示。
这里只能表示0.5 、 0.25 、 0.125 、0.0625这四个二进制数小数点后面的位权组合而成(相加总和)的小数。再回到我们要表示的0.1,怎么加都无法加到0.1的,只会变成0.00011001100...(1100的循环),不信你可以去试试。
说到这里,大家应该都能明白为什么将0.1累加100次也得不到10的原因了把,因为无法正确表示的数值,最后都变成了近似值。计算机是一个功能有限的机器设备,是无法处理无限循环的小数的,一般计算机都会从中间截断。
4、什么是浮点数
像1011.0011这样带小数点的表现形式,完全是纸面上的二进制数表现形式,在计算机内部是无法使用的。这一章节主要是说明计算机是以什么样的表现形式来处理小数。很多编程语言中都提供了两种表示小数的数据类型,分别是双精度浮点数与单精度浮点数。双精度浮点数类型用64位、单精度浮点数用32位来表示全体小数。从C语言中,双精度浮点数类型和单精度浮点数类型分别用double和float来表示。
浮点数是指符号、尾数、基数和指数这四个部分来表示的小数,如下图:
因为计算机内部使用的是二进制,所以基数自然就是2.因此,实际的数据中往往不考虑基数,只用符号、尾数、指数这三部分即可表示浮点数。也就是说,64位(双精度浮点数)和32位(单精度浮点数)的数据,会被分为三部分来使用,如下图展示:
5、正则表达式和EXCESS系统
① 尾数部分使用正则表达式,可以将表现形式多样的浮点数统一为一种表现形式。例如十进制的0.75就有很多种表现形式:
6、在实际的程序中进行确认
对EXCESS系统与正则表达式了解了吗,如果还没有了解,就返回上一小节再看一看,我也是看了几遍才看懂的,如果看懂了,就往下看,用C语言程序来确认单精度浮点数表示方法。
7、如何避免计算机计算出错
8、二进制数和十六进制数
以上是关于三:计算机进行小数运算时出错的原因的主要内容,如果未能解决你的问题,请参考以下文章