Java 输出给了我 "Infinity"
Java Output is Giving me "Infinity"
我编写的 Java 程序的输出是 "Infinity" 当我应该得到一个数字时。我正在使用浮点数,我认为我的数字不会超出浮点数可以处理的范围。
我的问题是,如果 Java 计算的值大于所使用的数据类型可以处理的值,我是否会得到 "Infinity" 作为输出?或者 "Infinity" 只有在我不小心在某处除以零时才返回。
请参考thedayofcondor的回答:What are the INFINITY constants in Java, really?
默认情况下,当您的操作超出浮点范围时,您确实会得到无穷大。但是,正如您所说,无穷大通常从某处的零除法开始,或者以循环(或太大)操作开始。如果您 post 一段代码,我可以提示您它的位置 'unprotected'。
Operation Result
n ÷ ± Infinity 0
±Infinity × ±Infinity ±Infinity
±nonzero ÷ 0 ±Infinity
Infinity + Infinity Infinity
±0 ÷ ±0 NaN
Infinity - Infinity NaN
±Infinity ÷ ±Infinity NaN
±Infinity × 0 NaN
JLS 非常明确地回答了这个问题。
A floating-point operation that overflows produces a signed infinity.
你可能在某处除以零,但你可以检查一下。
double b = 1.1*Double.MAX_VALUE;
System.out.println(b);
显示为无穷大。
是的,根据这个:
Maximum value for Float in Java?
浮点数的最大值是 Float.MAX_VALUE.
您可能希望使用调试器对除此浮点值的位置进行一些简单检查。或者,您可以在代码中添加日志语句。
Thread class 提供了一个名为 StackTraceElement 的 class。您可以使用它来查看哪个 class/line 号码。
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace()
https://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html
假设你有这样的东西:
float result = A / B;
任何时候你看到这样的东西,你都可以使用这个简单的打印语句:
float result = A / B;
System.out.format("Divisor: %d, Dividend: %d, result: %d", A, B, result);
// alternatively, add in the stack trace stuff.
一旦找到罪魁祸首,原因可能就很明显了。我的想法是,您可能会将此 'B' 值初始化为 0,但绝不会将其设置为您实际打算除以的浮点数。
我编写的 Java 程序的输出是 "Infinity" 当我应该得到一个数字时。我正在使用浮点数,我认为我的数字不会超出浮点数可以处理的范围。
我的问题是,如果 Java 计算的值大于所使用的数据类型可以处理的值,我是否会得到 "Infinity" 作为输出?或者 "Infinity" 只有在我不小心在某处除以零时才返回。
请参考thedayofcondor的回答:What are the INFINITY constants in Java, really?
默认情况下,当您的操作超出浮点范围时,您确实会得到无穷大。但是,正如您所说,无穷大通常从某处的零除法开始,或者以循环(或太大)操作开始。如果您 post 一段代码,我可以提示您它的位置 'unprotected'。
Operation Result
n ÷ ± Infinity 0
±Infinity × ±Infinity ±Infinity
±nonzero ÷ 0 ±Infinity
Infinity + Infinity Infinity
±0 ÷ ±0 NaN
Infinity - Infinity NaN
±Infinity ÷ ±Infinity NaN
±Infinity × 0 NaN
JLS 非常明确地回答了这个问题。
A floating-point operation that overflows produces a signed infinity.
你可能在某处除以零,但你可以检查一下。
double b = 1.1*Double.MAX_VALUE;
System.out.println(b);
显示为无穷大。
是的,根据这个: Maximum value for Float in Java? 浮点数的最大值是 Float.MAX_VALUE.
您可能希望使用调试器对除此浮点值的位置进行一些简单检查。或者,您可以在代码中添加日志语句。
Thread class 提供了一个名为 StackTraceElement 的 class。您可以使用它来查看哪个 class/line 号码。
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace() https://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html
假设你有这样的东西:
float result = A / B;
任何时候你看到这样的东西,你都可以使用这个简单的打印语句:
float result = A / B;
System.out.format("Divisor: %d, Dividend: %d, result: %d", A, B, result);
// alternatively, add in the stack trace stuff.
一旦找到罪魁祸首,原因可能就很明显了。我的想法是,您可能会将此 'B' 值初始化为 0,但绝不会将其设置为您实际打算除以的浮点数。