Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#数学。Acos如何预防NaN_C#_Math - Fatal编程技术网

C#数学。Acos如何预防NaN

C#数学。Acos如何预防NaN,c#,math,C#,Math,我试图编写一个代码来回答一个包含Acos“Cos-1(a)”的数学函数,其中a是一个双精度-10.0000,快速查看将显示参数所取的值应为: 表示余弦的数字,其中d必须大于或等于-1,但小于或等于1 如上所述,Math.Acos函数的参数必须在[-1,1]范围内。否则,结果将是NaNCos-1未定义为[-1..1] 它和Math.Acos函数无关——它可以归结为三角学。cos函数的结果不能大于1或小于-1。因此,cos函数的逆函数不能接受大于1或小于-1的参数。显然,Math.Acos为A1返回

我试图编写一个代码来回答一个包含Acos“Cos-1(a)”的数学函数,其中a是一个双精度-10.0000,快速查看将显示参数所取的值应为:

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

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

Cos-1未定义为
[-1..1]


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

显然,Math.Acos为A1返回NaN。在调用函数之前,只需排除这些值。

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

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

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

由于没有余弦值超出此范围的角度,因此当您询问
Acos
一个角度时,无法返回该角度。因此,它给出的答案是
NaN

其文档也说明了这一点:

参数:

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


acos只允许范围[-1;1]内的值,因此-10自然会给出NaN。

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

  • 将坐标乘以0.1,使其处于适当的范围内
  • 执行触发功能(圆弧功能返回角度&角度不关心腿的长度)
  • 如果转换回坐标对(sin,cos),则将每个坐标乘以10,以将它们返回到适当的比例
  • 您可以尝试以下方法:

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

    我遇到了这个问题。我的bug是由float的精度(在javascript中)引起的。它试图学习数学。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)
    }
    
    功能acos(n){
    如果(n>1){
    return Math.acos(1)
    }否则如果(n<-1){
    返回Math.acos(-1)
    }否则{
    return Math.acos(n)
    }
    
    为什么A超出了[-1,1]范围?你从哪里得到这个值?没有一个真正的角度会给你一个cos或sin值超出这个范围。看起来你是在乘以cos的结果-在这种情况下,你必须在使用acos之前再次除以它。另外,不要忘记
    acos(cos(alpha))
    不一定是
    alpha
    (cos是周期性的和全部的)。什么是
    整体.Ang
    ?大多数人不知道
    第1.个角为意味着