C#数学Acos如何防止NaN

本文关键字:何防止 NaN Acos 数学 | 更新日期: 2023-09-27 18:21:08

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

编辑时间:正如文档所说,在Math.Acos中,我给出了一个超出范围-1<d<1将返回一个NaN,我试图制作一个相同的函数,一步一步地允许这些值。

C#数学Acos如何防止NaN

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

您认为它应该为这些值返回一些东西的期望是不正确的。

反余弦函数回答了"这个余弦在哪个角度?"的问题。但是,对于余弦函数,没有任何值可以产生小于-1或大于1的结果。我们说它的"范围是[-1,1]"。

由于没有余弦值在此范围之外的角度,因此当您向Acos要求一个角度时,不可能给您一个角度。相反,它给出了NaN的答案。

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

参数:

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

Cos-1没有为[-1 .. 1] 之外的值定义

它与Math.Acos函数无关,它可以归结为三角函数。cos函数的结果永远不能大于1或小于-1。因此,cos函数的逆函数不能接受大于1或小于-1的参数。

快速查看文档会发现参数的取值应该是:

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

显然,Math.Acos为A&lt-1或A>1。在调用函数之前,只需排除这些值。

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

acos的范围是-1到1,这是因为实际三角数学中的限制,而不是函数或代码的问题。无论何时使用acos(),您都应该确保对您的值进行范围检查,或者使用其他机制来确保到达它的值始终在-1到1之间。也许您传递的值需要首先进行规范化?

你可以试试这个:

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

我遇到了这个问题。我的错误是由浮动(在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)
}

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

  1. 将你的坐标乘以0.1,使它们在正确的范围内
  2. 执行trig函数(arc函数返回一个角度&角度不在乎它们的腿有多长)
  3. 之后,如果转换回坐标对(sin,cos),则将每个纵坐标乘以10,使其返回到正确的比例