我的代码有一个奇怪的问题:我想计算反余弦,我使用 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-xi
和 ydest-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/