Java的浮点数
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。
http://www.cnblogs.com/shijiaqi1066/p/5160771.html
Float的表示与定义
IEEE754标准中一个float是32位的数字。
说明:
- 第0位用s表示。s=1表示负数,s=0表示正数。s即符号位(Sign)。
- 第[1,7]位用E表示。称为指数。E即指数(Exponent)
- 第[8,31]位用M表示。称为尾数。M即尾数(Mantissa)
若E全0,则尾数附加位为0。否则尾数附加位为1。
一个Float浮点数的值为:Value = (-1)^s *(1+M)*2^(E-127)
例:11000000101000000000000000000000
浮点数值 = -1*2^(129-127)*(2^0+2^-2)
对于64位浮点数(Double)来说:
- 第0位为Sign,即符号位。共1bit。s=1表示负数,s=0表示正数。
- 第[1-11]位为Exponent,共11bit。
- 第 [12-63]位为Mantissa,共52bit。
类似的,对于Double有计算公式:V=(-1)^s*(1+M)*2^(E-1023)
一张图概括:
浮点数表示的有效数字
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
最后给出一个很有意思的 bit 与 float 互转的可视化在线工具:http://www.binaryconvert.com/convert_double.html
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。