C#Math.Acos如何防止NaN

时间:2012-01-22 14:56:21

标签: c# math

我正在尝试制作一个代码来回答包含Acos“Cos -1 (A)”的数学函数,其中A是双-10.0000< = A< = 10.0000 ,我在这个范围内尝试了几个数字,其中大多数都给我一个NaN作为返回,使所有的操作失败。

编辑: 正如文档所说,使用Math.Acos,我把一个数字放在范围-1< = d< = 1将返回一个NaN,我试图制作一个相同的函数,一步一步地允许这些值

10 个答案:

答案 0 :(得分:9)

MSDN所述,Math.Acos函数的参数必须在[-1,1]范围内。否则,结果将为NaN

答案 1 :(得分:5)

您希望它应该为这些值返回一些内容是不正确的。

反余弦函数回答了“这个余弦的角度是多少?”的问题。但是没有值可以给余弦函数产生小于-1或大于1的结果。我们说它的“范围是[-1,1]”。

由于没有超出此范围的余弦值的角度,因此当您询问Acos时,无法给出角度。因此,它会为您提供NaN的答案。

Math.Acos的文档也说明了这一点:

  

<强>参数:

     

d :( System.Double)表示余弦的数字,其中 d 必须大于或等于-1,但小于或等于1。

答案 2 :(得分:4)

没有为[-1 .. 1]

之外的值定义

Cos -1

它与Math.Acos函数无关 - 它归结为三角函数。 cos函数的结果永远不会超过1或小于-1。因此,cos函数的反函数不能采用大于1或小于-1的参数。

答案 3 :(得分:2)

快速查看documentation将显示参数所需的值应为:

  

表示余弦的数字,其中d必须大于或等于-1,但小于或等于1.

答案 4 :(得分:1)

显然,Math.Acos返回NaN,A <-1或A> 1。只需在调用函数之前排除这些值。

答案 5 :(得分:1)

acos仅允许范围内的值[-1; 1],所以-10自然给你NaN。

答案 6 :(得分:0)

由于实际三角函数数学的限制,acos的范围是-1到1,而不是函数或代码的问题。每当使用acos()时,你应该确保对你的值进行范围检查,或者有一些其他机制来确保传递给它的值总是在-1到1之间。也许你传递它的值需要先规范化? / p>

答案 7 :(得分:0)

您可以尝试以下方法:

Whole.Ang[n] = (Math.Pow(Whole.Long[n], 2) + Math.Pow(Whole.Long[n - 1], 2) - Math.Pow(Line1, 2)
             / (2 * Whole.Long[n] * Whole.Long[n - 1]);

if (Whole.Ang[n] > Math.PI / 2)
{
    Whole.Ang[n] = Math.Asin(Math.PI / 2 - Whole.Ang[n]);
    Whole.Ang[n] = Math.Round(Whole.Ang[n] * 180 / Math.PI, 0) * 2;
    Whole.Ang[n] = (90 - Whole.Ang[n] * 2) + Whole.Ang[n];
    Console.WriteLine("第" + (n + 1) + "个角为:" + Whole.Ang[n]);
    continue;
}
else
{
    Whole.Ang[n] = Math.Acos(Whole.Ang[n]);
    Whole.Ang[n] = Math.Round(Whole.Ang[n] * 180 / Math.PI, 0);
    Console.WriteLine("第" + (n + 1) + "个角为:" + Whole.Ang[n]);
    continue;
}

答案 8 :(得分:0)

我遇到了这个问题。我的错误是由浮动精度引起的(在javascript中)。它试图使用Math.acos(1.000 ...)。只需限制范围:

function acos(n) {
   if (n > 1) {
      return Math.acos(1)
   } else if (n < -1) {
      return Math.acos(-1)
   } else {
      return Math.acos(n)
}

答案 9 :(得分:-1)

似乎没有人提供的简单答案是:

  1. 将您的坐标乘以0.1,使它们在适当的范围内。
  2. 执行三角函数(弧函数返回角度&amp;角度不关心它们的腿有多长)
  3. 之后如果你转换回坐标对(sin,cos)将每个纵坐标乘以10以使它们恢复到适当的比例