java - (Java) 使用 Math.acos 时 double 中出现奇怪的 NaN

标签 java double nan

我的代码有一个奇怪的问题:我想计算反余弦,我使用 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 始终相同,因此它们不是我的问题的根源)

最佳答案

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

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);
}

关于java - (Java) 使用 Math.acos 时 double 中出现奇怪的 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27538695/

相关文章:

java - JPA - 延迟加载 - LazyInitializationException - 不访问子集合时

node.js - 将 64 位 double 转换为 32 位浮点 Node.Js

java - 你如何测试一个 double 值是否等于 NaN?

java - 在java中实现Runnable接口(interface)后怎么可能调用Thread方法呢?

java - 按顺序进行 Junit 自动化测试

java - 在 Kafka Streams 中反序列化 POJO

java - 双减 int 给出意想不到的结果

java - 为什么我在 if 语句中定义 double 时遇到问题?

javascript - 函数会输出 nan 而不是数字,为什么?

pandas - 在 Pandas 中替换名称时忽略 NaN 值