上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.2 定点数与浮点数
计算机通过二进制的形式存储数据,然而大多数小数表示成二进制后是近似且无限的。以0.1为例,它是一个简单的十进制数,转换为二进制数后却非常复杂——0.0001100110011001100…是一个无限循环的数字。显然不能用数学中的计算方式存储所有的小数,因为有限的空间无法表达无限的结果,计算机必须有其他的机制来处理小数的存储与计算。
最简单的表示小数的方法是定点表示法,即用固定的大小来表示整数,剩余部分表示小数。例如,对于一个16位的无符号整数(uint)16,可以用前8位存储整数部分,后8位存储小数部分。这样整数部分的表示范围为0~256,小数部分的表示范围为1/256~1。这种表示方式在某些场景可能很适用,但是它不适用于所有场景。因为在一些情况下可能整数部分很大,小数部分的位数很少;而在另一些情况下可能整数部分很小,小数部分的位数很多。为了解决这一问题,我们自然会想到采用浮点表示法存储数据。例如在图2-1中,对于十进制数,可以通过科学计数法表示小数,那么5位数字可以表示的范围为0.00~9.99×10^99。这种方式既可以表示很大的整数,也可以表示很多的小数点后的位数。这就是计算机浮点数存储设计的灵感来源。
图2-1 小数的浮点表示法
Go语言与其他很多语言(如C、C++、Python)一样,使用了IEEE-754浮点数标准存储小数。IEEE-754浮点数标准由电气与电子工程师学会(IEEE)在1985年推出并在之后不断更新。许多硬件浮点数单元(例如intel FPU)使用IEEE-754标准。该标准规定了浮点数的存储、计算、四舍五入、异常处理等一系列规则。