前言JAVA数值分整数和浮点数,前一篇文章已经解析了Java整数的存储原理,本篇将接着解析浮点数在计算机里的存储原理 。Java浮点数分单精度类型( float)和双精度类型(double),float 数据占用 32bit,double 数据占用 64bit 。
Java浮点数标准java中浮点数采用的IEEE754标准,该标准的全称为IEEE二进制浮点数算术标准 。这个标准规定的存储格式是这样的:符号位+指数位偏移+尾数位
文章插图
IEEE 754常用的两种表示浮点数值的方式:单精确度(float 32位)、双精确度(double 64位)
文章插图
- 浮点数表示的数值:V = (-1)^s × M × 2^E
- 符号(sign) :1个bit表示,当s=0,V为正数;当s=1,V为负数 。
- 阶码(exponent) :E的作用是对浮点数加权,用于存储科学计数法中的指数数据,并且采用移位存储 。float类型的阶码是 8 bits,double类型的阶码是 11 bits 。
- 尾数(significand) :M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M<2 。(和十进制中范围为1~10一样)
至于指数E,情况就比较复杂 。首先,E为一个无符号整数(unsigned int)这意味着,如果E为8位 (float类型) ,它的取值范围为0~255;如果E为11位(double类型),它的取值范围 为0~2047 。但是,我们知道,科学计数法中的E是可以出现负数的(因为0.75用科学计数法表示就是1.1*2^-1),所以 IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023 。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001 。
浮点数转二进制数能精确表示的浮点数
哪些小数能被精确表示呢?0.5的倍数,且在精度以内 。
方便计算,首先选择可以用浮点数精确表示的数计算:4.25
- step1.首先将数字转为2进制:
4/2=2 余 0
2/2=1 余 0
1/2=0 余 1
小数部分0.25:"乘2取整"
0.25 * 2 = 0.5 未进位 0
0.50 * 2 = 1 进位整数 1
二进制表示:100.01
- step2.将二进制数转为科学计数法表示
- step3.转换为IEEE754格式存储
指数 2 (float指数+127=127 double指数+1023=1025)
尾数 0001
单精度float:符号位0 指数位129(10000001) 尾数001
0 10000001 00010000000000000000000
双精度double:符号位0 指数位1025(10000000001) 尾数001
0 10000000001 0001000000000000000000000000000000000000000000000000
不能精确表示的浮点数
举个例子:1/3,十进制就无法精确表示三分之一这个数字 。
二进制也有很多很多小数无法精确表示,包括:0.1和0.2,这也是导致计算出现精度问题的根本原因 。
下面将0.1转为2进制表示 。
0.1
- step1.首先将数字转为2进制:
0.20 * 2 = 0.40 未进位 0
0.40 * 2 = 0.80 未进位 0
0.80 * 2 = 1.60 进位 1
0.60 * 2 = 1.20 进位 1
0.20 * 2 = 0.40 未进位 0
0.40 * 2 = 0.80 未进位 0
0.80 * 2 = 1.60 进位 1
0.60 * 2 = 1.20 进位 1
无限循环(0011)...
二进制表示0.1:
0.00011001100110011001100110011001100110011001100110011001...
- step2.将二进制数转为科学计数法表示
1.1001100110011001100110011001100110011001100110011001... * 2^-4
- step3.转换为IEEE754格式存储
指数 -4 (float指数+127 double指数+1023)
推荐阅读
- 读懂男人心理书籍推荐 男人一生必读的10本书
- 读懂这些术语,学会如何挑选香槟
- 一文讲弄懂vlan、三层交换机、网关、DNS、子网掩码、MAC地址
- 一文了解 Redis 内存监控和内存消耗
- 下腹部针对性训练,6个动作,简单方便,帮你紧实小腹变平坦
- 一文告诉你信息流和竞价的区别在哪里?
- 一文看懂Oracle查询表空间的每日增长量和历史情况统计
- 一文读懂线性回归、岭回归和Lasso回归
- 一文聊透 Dubbo 优雅停机
- 什么是编译器?什么是集成开发环境?一文讲明白