在OJ(在线判题系统)的题目中偶尔会出现浮点数这一数据类型,对该类型的理解是刷这类题必须要经历的历程。
对于浮点数,百度对其解释为:
用白话讲,就是小数的意思。
整型在内存中的存储很好理解,但浮点数就稍微复杂了那么一点点。
根据国际IEEE(电气电子工程师学会)754标准,在内存中任意一个二进制浮点数有以下形式:
表示符号位,即浮点数为正还是为负用此表达。
是介于 1 ~ 2 的有效数字,以 1 . xxxxx 表示。
表示指数位,可以理解为多少位数。
而V则表示浮点数啦。
对于十进制的 10 ,用二进制可表示为 1010.0 ,由此可得其存储形式S应该为偶数,这样才表示其为正数;M为1.01,取其最前端(最左边)的那个 1 做1.xxx,后面各个位数为小数部分;而E则为3,因为最前端的1和小数点差三位数。
那么就有:
再比如十进制的-45.5,用二进制表示为101101.1,S应为奇数表示其为负数;M为1.011011,小数点后的1也要考虑进去;E则为5。
也就是:
对于32位的浮点数,内存分配为:
首位即为符号位S,1~9位为指数位E,剩余23位为有效数字位。
实际上M为24位,因为其1.xxx中数值1是固定的,只要在计算的时候加上即可,这样的话存储数值1的那位就可以空出来,所有M应该是23+1位也就是24位。
对于64位浮点数,内存分配为:
S 1 位,E 11 位,M为剩余 52 位(实际53)。