Float之谜
先来看几个例子:
public class Thirtyfirst1{ public static void main(String[] args){ int i = 2000000000; int count = 0; for(float f = i; f < i + 50 ; f ++){ count++; } System.out.println(count); } }
会输出多少?
public class Thirtyfirst1{ public static void main(String[] args){ int i = 2000000000; int count = 0; for(float f = i; f < i + 64 ; f ++){ count++; } System.out.println(count); } }
这个会输出多少?
public class Thirtyfirst1{ public static void main(String[] args){ int i = 2000000000; int count = 0; for(float f = i; f < i + 65 ; f ++){ count++; } System.out.println(count); } }
这个输出多少?
第一题:0
第二题:0
第三题:死循环
再看下面的解析时需要知道浮点数的存储,以及int转float时的步骤(java浮点数剖析)
一、首先看看2000000000的二进制
01110111 00110101 10010100 0(0000000)
括号内为转换成浮点数后要舍弃的尾部
转换成浮点数后
0 10011101 11011100 11010110 0101000
S E M(23位)
二、然后观察2000000000+64
01110111 00110101 10010100 0(1000000)
转换成浮点数
0 10011101 11011100 11010110 0101000
发现和2000000000的浮点存储一模一样
三、然后观察2000000000+65
01110111 00110101 10010100 0(1000001)
显然
01110111 00110101 10010100 0
01110111 00110101 10010100 0(1000001)
01110111 00110101 10010100 1
显然中间的数更接近下面的数,因此浮点化之后
0 10011101 11011100 11010110 0101001
比2000000000的浮点存储大1
因此前两个程序打印0就可以理解了(重点要知道怎么转化成浮点数,以及怎么舍弃尾部)
四、1的浮点表示
0 01111111 0000000 00000000 00000000
五、浮点数的加减运算
对阶:
阶差位30
故f++对f基本上没有影响
因此会是死循环!!!