在Go语言编程中,有两种类型用于表示小数:
float32 (单精度类型、4字节字节、占32位二进制位) )。
float64 (双精度类型、8字节字节、占64位二进制位) ) )。
那么,计算机是如何将浮点型存储在内存中的呢?
现在,让我们从计算机中最小单位的位(二进制位)方面进行详细分析。
我们知道计算机中的数据最终必须转换为二进制数据并存储。
任何数据(字符、图像、视频、音频)存储在计算机上都会生成类似0 1的二进制代码
那么,首先,让我们用二进制数据表示小数:
转换为以2为底的科学计数法:
从以上情况可以看出,对于任何数量,用二进制科学计数法表示,都是1.xxx ()尾数(* 2转换后的n次幂) )指数)。
必须注意的是,例如,上图中的十进制小数0.6表示为二进制数,表示为1001个循环的无限循环小数。
这是浮点数精度问题的根源之一,是用代码声明的小数0.6,计算机底部不能正确存储其无限循环的二进制数。
只能保存零舍一入(如十进制四舍五入)后的近似值。
对于小于0负数,可以表示为-1.xxx (尾数) * 2的n次幂)指数)
因此,要在内存中存储此小数,可以将其分解为三个部分进行存储。
符号
尾数
指数
如图所示:
具体的记忆方式如上图所示。 最高有效位存储1位的符号,指数部分占8bits(4字节)或11bits字节),其馀部分全部用于尾数部分的存储。
对于指数部分,此处存储的结果是实际指数的偏移。
在此设定偏移量是为了不在指数部分出现负数,全部设为0以上的正整数。
尾数部的保存,由于是二进制的科学计数法,小数点前一定要以1开始,所以我们尾数部只要保存小数点以下的部分就可以了。
以下示例显示4字节浮点数(Golang的浮点32 )。
让我们看看8字节浮点数(Golang的浮点64 )的示例。
偏移:
4字节浮点数的偏移为127
8字节浮点数的偏移为1023
加上偏移量,可以将正数和负数统一转换为无符号证书,比较容易。 举个例子吧。
如果4字节浮点数的指数部分为-7,则通常表示10000111 1是符号位,而负数。
7表示00000111 0为符号位,为负数。
如果将7和7一起加上偏移量127
7变为134,二进制表示为10000110
-7变为120,二进制表示为01111000
在两者比较大的情况下,计算机不需要比较两者的编码比特。
摘要计算机在存储小数时分为两种类型:
单精度型(32进制位,占4字节) )。
双精度型(64位,占8字节) )。
双精度型比单精度型更能准确地表示小数,但内存区域也更大。
计算机表示小数时,首先将该小数转换为以2为底的科学计数法。
然后,根据该数字,将小数分解为编码位、指数、尾数,存储到存储器中。