获取NaN作为简单Java程序的答案

时间:2014-08-06 15:28:34

标签: java math

我最近在学习Java,所以我开始将我的程序用C ++转换成Java,但是当我计算距离时,我得到了NaN作为答案。谁能告诉我这里的问题是什么?谢谢。 以下是代码:

import java.util.Scanner;
import java.lang.Math;

public class Labsheet1Number1 {

public static void main(String[] args) {
    double length=0,height=0,pi=3.142;
    double distance=0,angle=0;

    Scanner input = new Scanner(System.in);
    System.out.println("This program will calculate the distance and the angle.");
    System.out.print("Enter the length of the ladder: ");
    length = input.nextInt();
    System.out.print("Enter the height of the wall: ");
    height = input.nextInt();

    distance = Math.sqrt(Math.pow(length, 2) - Math.pow(height, 2));

    angle = (180/pi) * (Math.sin(height/length));

    System.out.println("The distance is " + distance);
    System.out.println("The angle is " + angle);
}

}

2 个答案:

答案 0 :(得分:6)

如果计算两点之间的距离,则距离应为:

distance = Math.sqrt(Math.pow(length, 2) + Math.pow(height, 2));

实际上,您可能正在计算Math.sqrt(x)的负数,这可以解释NaN(非数字)结果。

来自Math.sqrt()的JavaDoc:

  

如果参数为NaN或小于零,则结果为NaN

编辑:

由于@AnthonyGrist评论,我再次阅读了这个问题。 虽然距离计算公式为dist(p1,p2) = sqrt ( (x1-x2)^2 + (y1-y2)^2 ),但根据用户请求的输入 - Enter the length of the ladder:Enter the height of the wall: - 我们有理由相信我们要计算的距离是水平的梯子底部距离墙壁底部的距离。

如果是这种情况,p1和p2是梯子边缘的位置(为简单起见,假设梯子是1维),上面等式中的dist(p1,p2)已经知道了 - 它是{{ 1}}。假设梯子到达墙的顶部,我们也知道length

因此,我们想要计算的实际上是height = abs(y1-y2)

如果我们重新安排上述等式,我们得到:

abs(x1-x2)

这正是问题中的原始等式。

然而,这个等式只有在distance = abs(x1-x2) = sqrt (dist(p1,p2)^2 - (y1-y2)^2) = sqrt (length^2 - height^2)时才是正确的(因为它们的梯子不能到达高于其自身长度的墙的顶部)。因此,为了避免无效结果(NaN),您应该验证输入,并确保height <= length

答案 1 :(得分:3)

  

Nan代表的不是数字。如果小数运算有一些输入   这导致操作产生一些奇怪或未定义的结果   示例负数的平方根是未定义的,基本上在Math.sqrt()的代码中执行长度 2 -height 2 &lt; 0 。它也可能由0.0/0.0引起,但事实并非如此。