java基础一题 什么申明使得以下循环称为无限循环( ;)while(i==i+1){ } 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 while(i==i+1){ }不是死循环 double i = Double.POSITIVE_INFINITY; 一个数永远不会等于它自己加1吗?i==i+1一个数永远不会等于它自己加1,对吗?如果数字是整型,则对;如果这个数字是无穷大或都是浮点型足够大(如1.0e40),等式就可能成立了。 Java强制要求使用IEEE 754浮点数算术运算,它可以让你用一个double或float来表示无穷大。 浮点型分为double型、float型。 无穷分为正无穷与负无穷。 无穷大加1还是无穷大。 一个浮点数值越大,它和其后继数值之间的间隔就越大。 对一个足够大的浮点数加1不会改变它的值,因为1不足以“填补它与其后者之间的空隙”。 浮点数操作返回的是最接近其精确数学结果的浮点数值。 一旦毗邻的浮点数值之间的距离大于2,那么对其中的一个浮点数值加1将不会产生任何效果,因为其结果没有达到两个数值之间的一半。对于float类型,加1不会产生任何效果的最小数是2^25,即33554432;而对于double类型,最小数是2^54,大约是1.8*10^16。 33554432F转二进制过程:33554432的二进制为:10000000000000000000000000,将该二进制化成规范的小数二进制,即小数从右向左移25位1.0000000000000000000000000,化成浮点数二进制0,25+127, 00000000000000000000000 00(丢弃最后两位),即0, 10011000, 00000000000000000000000,最后的结果为1.00000000000000000000000*2^25毗邻的浮点数值之间的距离被称为一个ulp,它是最小单位(unit in the last place)的首字母缩写。在5.0版本中,引入了Math.ulp方法来计算float或double数值的ulp。 二进制浮点算术只是对实际算术的一种近似。Java代码 // 注,整型数不能被 0 除,即(int)XX/0运行时抛异常 double i = 1.0 / 0.0;// 正无穷大 double j = -1.0 / 0.0;// 负无穷大 // Double.POSITIVE_INFINITY定义为:POSITIVE_INFINITY = 1.0 / 0.0; System.out.println(i + " " + (i == Double.POSITIVE_INFINITY));//Infinity true // Double.NEGATIVE_INFINITY定义为:NEGATIVE_INFINITY = -1.0 / 0.0; System.out.println(j + " " + (j == Double.NEGATIVE_INFINITY));//-Infinity true System.out.println(i == (i + 1));// true System.out.println(0.1f == 0.1);// false float f = 33554432; System.out.println(f + " " + (f==(f+1)));//3.3554432E7 true // 注,整型数不能被 0 除,即(int)XX/0运行时抛异常double i = 1.0 / 0.0;// 正无穷大double j = -1.0 / 0.0;// 负无穷大// Double.POSITIVE_INFINITY定义为:POSITIVE_INFINITY = 1.0 / 0.0;System.out.println(i + " " + (i == Double.POSITIVE_INFINITY));//Infinity true// Double.NEGATIVE_INFINITY定义为:NEGATIVE_INFINITY = -1.0 / 0.0;System.out.println(j + " " + (j == Double.NEGATIVE_INFINITY));//-Infinity trueSystem.out.println(i == (i + 1));// trueSystem.out.println(0.1f == 0.1);// falsefloat f = 33554432;System.out.println(f + " " + (f==(f+1)));//3.3554432E7 true 直接:while(true){System.out.println("while");}for(;;){System.out.println("for");} 所以说哦,书是要看的一切尽在《java解惑》中 对啊,上面说到很对啊,一个很大的数加上1后在java中可能会损失精度的问题啊! while(true) {}书上有的,你没看书吗?很多很多的书在书店,你可以去取经... while(i==i+1){}不论i为何值i==i+1都为假所以根本不会进入循环,怎么成为死循环。 如果是基础问题的话,就应该是for(;;;);while(true){}; 如果层次高点,就是精度的问题了 这个.....还有何意义啊!!我原以为i为boolean可以,结果int和boolean不兼容!!! Applet显示问题 请问java中的一个类怎么用的 请问如何在java中获得win7管理员权限 Java菜鸟,请各位高手指点 用javascript判断时间是否大于24小时 问个比较简单的问题关于算法的 请兄弟帮看一个程序,老师说要分析一下,还要改进,是关于Inner class 关于更新JLabel图标的问题 求助:怎样做一个状态栏控件? 使用ZMQ应答模式,客户端发消息给服务端,没有收到消息再次发送就会死掉。 JAVA排序 如何使arraylist 线程安全??
一个数永远不会等于它自己加1,对吗?如果数字是整型,则对;如果这个数字是无穷大或都是浮点型足够大(如1.0e40),等式就可能成立了。 Java强制要求使用IEEE 754浮点数算术运算,它可以让你用一个double或float来表示无穷大。 浮点型分为double型、float型。 无穷分为正无穷与负无穷。 无穷大加1还是无穷大。 一个浮点数值越大,它和其后继数值之间的间隔就越大。 对一个足够大的浮点数加1不会改变它的值,因为1不足以“填补它与其后者之间的空隙”。 浮点数操作返回的是最接近其精确数学结果的浮点数值。 一旦毗邻的浮点数值之间的距离大于2,那么对其中的一个浮点数值加1将不会产生任何效果,因为其结果没有达到两个数值之间的一半。对于float类型,加1不会产生任何效果的最小数是2^25,即33554432;而对于double类型,最小数是2^54,大约是1.8*10^16。 33554432F转二进制过程:
33554432的二进制为:10000000000000000000000000,将该二进制化成规范的小数二进制,即小数从右向左移25位1.0000000000000000000000000,化成浮点数二进制0,25+127, 00000000000000000000000 00(丢弃最后两位),即0, 10011000, 00000000000000000000000,最后的结果为1.00000000000000000000000*2^25
毗邻的浮点数值之间的距离被称为一个ulp,它是最小单位(unit in the last place)的首字母缩写。在5.0版本中,引入了Math.ulp方法来计算float或double数值的ulp。 二进制浮点算术只是对实际算术的一种近似。Java代码
// 注,整型数不能被 0 除,即(int)XX/0运行时抛异常
double i = 1.0 / 0.0;// 正无穷大
double j = -1.0 / 0.0;// 负无穷大
// Double.POSITIVE_INFINITY定义为:POSITIVE_INFINITY = 1.0 / 0.0;
System.out.println(i + " " + (i == Double.POSITIVE_INFINITY));//Infinity true
// Double.NEGATIVE_INFINITY定义为:NEGATIVE_INFINITY = -1.0 / 0.0;
System.out.println(j + " " + (j == Double.NEGATIVE_INFINITY));//-Infinity true
System.out.println(i == (i + 1));// true
System.out.println(0.1f == 0.1);// false
float f = 33554432;
System.out.println(f + " " + (f==(f+1)));//3.3554432E7 true // 注,整型数不能被 0 除,即(int)XX/0运行时抛异常
double i = 1.0 / 0.0;// 正无穷大
double j = -1.0 / 0.0;// 负无穷大
// Double.POSITIVE_INFINITY定义为:POSITIVE_INFINITY = 1.0 / 0.0;
System.out.println(i + " " + (i == Double.POSITIVE_INFINITY));//Infinity true
// Double.NEGATIVE_INFINITY定义为:NEGATIVE_INFINITY = -1.0 / 0.0;
System.out.println(j + " " + (j == Double.NEGATIVE_INFINITY));//-Infinity true
System.out.println(i == (i + 1));// true
System.out.println(0.1f == 0.1);// false
float f = 33554432;
System.out.println(f + " " + (f==(f+1)));//3.3554432E7 true
while(true){
System.out.println("while");
}
for(;;){
System.out.println("for");
}
书上有的,你没看书吗?很多很多的书在书店,你可以去取经...
不论i为何值i==i+1都为假所以根本不会进入循环,怎么成为死循环。
while(true){};
如果层次高点,就是精度的问题了