Ios 目标c使用tan返回不同的答案

Ios 目标c使用tan返回不同的答案,ios,objective-c,trigonometry,Ios,Objective C,Trigonometry,我有一个等式: double center = self.Altitude * tan(Pitch); 其中高度=130 螺距=90度,对于这个等式,我将其转换为1.570796弧度 用计算器我得到了答案:397802904 该计划获得:-362461013356.731689 你知道为什么吗 谢谢大家! 未定义90度的切线。如果你把它看作是与圆相交的直线的梯度,这是有道理的。90度时,直线垂直,因此具有未定义的坡度 您可能应该从tan()调用中得到NaN,除非在转换过程中它没有精确到PI/2

我有一个等式:

double center = self.Altitude * tan(Pitch);
其中高度=130

螺距=90度,对于这个等式,我将其转换为1.570796弧度

用计算器我得到了答案:397802904

该计划获得:-362461013356.731689

你知道为什么吗


谢谢大家!

未定义90度的切线。如果你把它看作是与圆相交的直线的梯度,这是有道理的。90度时,直线垂直,因此具有未定义的坡度

您可能应该从
tan()
调用中得到
NaN
,除非在转换过程中它没有精确到PI/2弧度。最好使用为此目的提供的常量:

double rads = (double)degs * M_PI / 180.0; // in C, not sure about ObjC.
以尽量减少可能出现的错误

更有可能的是,因为你处理的是非常大的数字,所以计算器和计算机之间精度的任何微小变化都会对答案产生相应的影响


1度和2度之间的坡度差异相当小(0.017->0.035),因为两条线都非常接近水平。88度和89度之间的差异要大得多(29->57度)。89和89.999之间的差异确实很大(57到57000)。

90度的切线没有定义。如果你把它看作是与圆相交的直线的梯度,这是有道理的。90度时,直线垂直,因此具有未定义的坡度

您可能应该从
tan()
调用中得到
NaN
,除非在转换过程中它没有精确到PI/2弧度。最好使用为此目的提供的常量:

double rads = (double)degs * M_PI / 180.0; // in C, not sure about ObjC.
以尽量减少可能出现的错误

更有可能的是,因为你处理的是非常大的数字,所以计算器和计算机之间精度的任何微小变化都会对答案产生相应的影响


1度和2度之间的坡度差异相当小(0.017->0.035),因为两条线都非常接近水平。88度和89度之间的差异要大得多(29->57度)。89和89.999之间的差异确实很大(57到57000)。

您的变化结果是由于从度到弧度的转换没有正确执行以获得预期的
tan()
结果。这是一个“tan(PI/2)未定义”问题。这是一个度到弧度和切线(x接近90度)的问题

当您将90度转换为弧度时,报告中没有得到1.570796。相反,当您将90度转换为弧度时,结果接近1.570796。很可能您认为您已转换为1.570796,因为这是您看到转换的十进制表示形式时出现的结果。该十进制转换是内部浮点表示的舍入表示。您拥有的值更有可能更接近1.570796324。。。因为这个数字的切线大约是397802904

当您尝试将度转换为弧度时,可以使用类似于
度*2*PI/360
的方法。问题是不能准确地表示PI,因此转换结果是近似的
tan(x)
对PI/2的微小变化非常敏感,并且由于您可能使用了略微不同的PI值和/或您的函数每稍微不同一点,因此您得到了非常不同的答案

无论精度如何,都不能用浮点表示法精确表示Pi,因此
tan(MACHINE\u APPROXIMATE\u Pi/2)
将不等于0

若要使用度获得更好的答案,必须在转换为弧度之前以度为单位缩减参数范围

// Only for 0 <= angle <= 90
double tan_degree(double angle) {
  if (angle > 45) {
    if (angle == 90) {
      return INF;
    }
    angle = 90 - angle;
    return 1/tan(angle*2*PI/360);
  }
  else {
    return tan(angle*2*PI/360);
  }
}

//仅对于0您的变量结果是由于从度到弧度的转换未正确执行,无法获得预期的
tan()
结果。这是一个“tan(PI/2)未定义”问题。这是一个度到弧度和切线(x接近90度)的问题

当您将90度转换为弧度时,报告中没有得到1.570796。相反,当您将90度转换为弧度时,结果接近1.570796。很可能您认为您已转换为1.570796,因为这是您看到转换的十进制表示形式时出现的结果。该十进制转换是内部浮点表示的舍入表示。您拥有的值更有可能更接近1.570796324。。。因为这个数字的切线大约是397802904

当您尝试将度转换为弧度时,可以使用类似于
度*2*PI/360
的方法。问题是不能准确地表示PI,因此转换结果是近似的
tan(x)
对PI/2的微小变化非常敏感,并且由于您可能使用了略微不同的PI值和/或您的函数每稍微不同一点,因此您得到了非常不同的答案

无论精度如何,都不能用浮点表示法精确表示Pi,因此
tan(MACHINE\u APPROXIMATE\u Pi/2)
将不等于0

若要使用度获得更好的答案,必须在转换为弧度之前以度为单位缩减参数范围

// Only for 0 <= angle <= 90
double tan_degree(double angle) {
  if (angle > 45) {
    if (angle == 90) {
      return INF;
    }
    angle = 90 - angle;
    return 1/tan(angle*2*PI/360);
  }
  else {
    return tan(angle*2*PI/360);
  }
}

//仅针对0,我使用了1弧度=57.2957795度的转换,这是因为tan(PI/2)未定义。我使用了1弧度=57.2957795度的转换,这是因为tan(π/2)是未定义的,明白了。除了,如果我用89度计算同一等式的计算器,那么我得到7447.69519,程序得到397802904。000000@user2125844,是的,这也是我从计算器(和计算机)中得到的值。那是因为它没有危险地接近90。你得到了哪个值?7447.69519?@user2125844,tan(89度)乘以130得到57.297447.7-ish。明白了。除外