1

在 Visual Studio C++ 中进行一些计算时,我发现最终angle值为-1.#IND000000000000

这个值是什么意思?是否超出范围?以下是我试图实现的代码如何计算圆上两点之间的弧角?从这里提到的这个公式
cos -1 ((x 1 x 2 + y 1 y 2 + z 1 z 2 ) / r 2 )

代码

double x = vec1X * vec2X;
double y = vec1Y * vec2Y;
double r = sqrt(((vec2X - originX) * (vec2X - originX))+((vec2Y - originY) * (vec2Y - originY)));
angle = acos ((x + y) / r*r);

重现错误的样本值

vec1X = 91.094001770019531;
vec1Y = 147.74990844726562;
vec2X = 94.163322448730469;
vec2Y = 187.93711853027344;
originX = 136.79920959472656;
originY = 223.69624328613281;
4

3 回答 3

3

这意味着结果是不确定的;更标准的术语是“不是数字”或“NaN”。

这里可能的原因是:

  • 的论点sqrt是否定的
  • 除法的两个操作数都为零
  • 的参数acos在范围之外[-1,1]

任何这些都可能由于浮点舍入错误而发生,即使在数学上它们不应该是可能的;因此,在将值传递给输入范围有限的函数之前,您应该始终检查它们。

于 2013-04-17T10:19:58.837 回答
1

这是因为acos参数应该位于 [-1.0 .. 1.0] 中,而您的不是。例如,如果r接近于零,则您有很大的错误。如果您确定,该输入是可以的,然后尝试将小于 -1 的值映射到 -1,并将大于 1 的值映射到 1

于 2013-04-17T10:18:45.340 回答
1

这是一个NaN值。

它实际上意味着一个“不确定”的值,这意味着它可以是“任何东西”。将 0 除以 0 是“不确定的”。

不计算这些,acos 中参数的值是多少?(应该在 -1 和 1 之间)

于 2013-04-17T10:18:55.417 回答