(Java)使用Math.acos时,使用两次奇怪的NaN

时间:2014-12-18 03:16:40

标签: java double nan

我的代码有一个奇怪的问题:我想计算一个arc-cosinus,我使用Math.acos。但是当我尝试计算它时,它有时会返回NaN(我说“有时”因为它与 相同值 一起发生1/10时间。)

最糟糕的是:

double angle = Math.acos((v.xdest-v.xi)/Math.sqrt(Math.pow(v.xdest-v.xi,2)+Math.pow(v.ydest-v.yi,2)));
System.out.println(angle);
    /* 
    Some code
    */
System.out.println(Math.acos((v.xdest-v.xi)/Math.sqrt(Math.pow(v.xdest-v.xi,2)+Math.pow(v.ydest-v.yi,2))));

当我运行此代码时,我得到:

NaN 
2.620575634136091

即使是 相同的 计算!

如果我跑:

double angle = Math.acos((v.xdest-v.xi)/Math.sqrt(Math.pow(v.xdest-v.xi,2)+Math.pow(v.ydest-v.yi,2)));
System.out.println(angle);
System.out.println(Math.acos((v.xdest-v.xi)/Math.sqrt(Math.pow(v.xdest-v.xi,2)+Math.pow(v.ydest-v.yi,2))));
        /* 
        Some code
        */

我得到了

NaN
NaN

看起来两个计算之间的代码使它成为可能。但是这段代码不会修改任何东西。

我不知道该怎么做。

xdest-xiydest-yi始终相同,因此它们不是我问题的根源)

1 个答案:

答案 0 :(得分:2)

double Math.acos(double v)如果v是NaN或者Math.abs(v)大于1,则应返回NaN。 如果您尝试计算两个向量之间的角度,则应使用以下公式:

double angleBetweenVectors(Vect v1, Vect v2) {
    double cos = scalarProduct(v1, v2) / (length(v1) * length(v2));
    double acos = Math.acos(cos);
    return Math.toDegrees(acos);
}

double scalarProduct(Vect v1, Vect v2) {
    double x1 = v1.xdest - v1.xi;
    double x2 = v2.xdest - v2.xi;
    double y1 = v1.ydest - v1.yi;
    double y2 = v2.ydest - v2.yi;
    return x1*x2 + y1*y2;
}

double length(Vect v) {
    double x = v.xdest - v.xi;
    double y = v.ydest - v.yi;
    return Math.sqrt(x*x + y*y);
}