我有一个等式:
double center = self.Altitude * tan(Pitch);
海拔高度= 130
音高= 90度,对于此等式,我将其转换为1.570796弧度
使用计算器我得到了答案:397802904
该计划得到:-362461013356.731689
任何想法为什么?
谢谢!
答案 0 :(得分:3)
未定义90度的正切。如果您将其视为与圆相交的线的渐变,则这是有意义的。在90度时,线是垂直的,因此具有不确定的梯度。
你的NaN
电话可能应该得到tan()
,除非你的转换中没有完全 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到57,000)。
答案 1 :(得分:0)
您的变体结果是由于您从度数转换为弧度而未正确执行以获得预期的tan()
结果。 不“tan(PI / 2)未定义”问题。它是弧度和切线(x 接近 90度)问题的度数。
当您将90度转换为弧度时,您报告时未获得1.570796。相反,当您将90度转换为弧度时,结果接近 1.570796。您很可能想到转换为1.570796,因为这是您看到转换的十进制表示时出现的内容。该十进制转换是内部浮点表示的舍入表示。更有可能你的价值更像是1.570796324 ...因为该数字的正切值约为397802904。
当您尝试将度数转换为弧度时,使用类似degrees*2*PI/360
的内容。问题是,人们无法完全代表PI ,因此转换结果是近似值。 tan(x)
非常对PI / 2的轻微变化敏感,并且由于您可能使用稍微不同的PI值和/或您的功能稍有不同,因此您得到的答案大不相同。 / p>
无论您的精度如何,您都不能完全以浮点表示法表示Pi,因此tan(MACHINE_APPROXIMATE_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);
}
}
要确定其他角度的tan_degree(),需要类似的角度缩小。
sin_degree()和cos_degree()需要类似的范围缩小。