无论任何编程语言,在表达数值的时候,都具备表达整数和小数的能力。
但是在表达小数的时候,往往不能准确的表达。举个例子,0.3这个小数,计算机就无法准确的表达。
为什么呢?
这与计算机通过硬件对数据存储的机制有关。
一、计算机如何存储和表达整数
人们都说,计算机实际上很傻,他连2都不认识。只知道0和1.
存储元件,通电即为1,不通电即为0.
那么一个存储元件能表达多少种状态呢?很显然就是0和1两种状态。
如果两个存储元件排在一起,那能表达多少种状态呢?我们可以通过控制开关,实现00,01,10,11,四种状态。也就是2的2次方。
当我们有三个存储元件排在一起,那就是000,001,010,011,100,101,110,111这样8种状态,也就是2的3次方。
以此类推:
N个存储元件排列在一起,就可以表达2的N次方个状态。
如果对每一个状态从0开始编号。那么就可以说,表达了0到2的N次方-1个整数了。
按照数学的方式来表达一个公式的话。那么任意的二进制数排列在一起,表达一个十进制整数的公示就变成:
二进制各位从低到高(从右至左)依次乘以2的N次方,其中,N从0开始。
例如: = 12
这就是整数的表达方法。
这里其实蕴含着背后的一个机理,那就是整数是离散的数,1,2,3,4,5。。。。。。,是固定的离散数,计算机都可以通过状态的排列叠加来准确的表达出来。
当然,整数还分为有符号整数(也就是带正负号)和无符号整数两部分。具体的就不展开了。
二、计算机如何存储和表达小数
那么问题来了。
如何存储和表达小数呢?
存储小数的话题比较复杂,如果想解开谜题可能要花些笔墨,大家自行查询吧。你会顺便了解浮点数(float)名字的由来。
着重来了解一下,表达小数的问题。
按照计算机硬件存储整数的套路,计算机用二进制表达小数换算为十进制小数的方式也是一样的。
例如:
以小数点为分割,整数部分和小数部分分别计算。
三、为什么计算机表达小数不准确?
了解了计算机表达整数和表达小数的方法。你一定注意到了一个细节。那就是,整数作为离散的数据,计算机可以完美的通过多个二进制数的状态叠加来覆盖所有的整数。
然而,小数是连续的,或者数学上也称之为“无限”的。计算机可以通过状态的排列叠加表达超级超级多的状态,但是仍然是有限的。因为硬件是实实在在的就那么多。
比如:0.3这个小数。如果通过二进制存储元件来组合表达,我们怎么来做呢?这里只能采用贪新算法。
首先,我们在最高位赋值1,看看表达的小数是否超过0.3。
已经超过了0.3,遂赋值为0,次高位继续上述操作。
接下来,继续尝试接近0.3,在第三高位赋值为1.
超过0.3,赋值为0,继续尝试,直至
如此往复,尝试下去,将始终无法达到0.3,只能无限接近。但由于元件个数限制(表达容量),甚至无法做到无限接近。
这就是为什么小数无法被准确表达的缘故。
学会了就点个赞吧。:)