为什么没有asin2()和acos2()函数类似于atan2()?

时间:2015-03-17 08:22:08

标签: function math programming-languages trigonometry

根据我的理解,atan2()函数存在于编程语言中,因为atan()本身不能总是确定正确的θ,因为输出被限制为-pi / 2到pi / 2。

如果是这种情况,那么同样的问题同时适用于asin()acos(),两者都有限制范围,那么为什么没有asin2()和{{ 1}}函数?

4 个答案:

答案 0 :(得分:9)

首先请注意,语法为atan(y/x)atan2(y, x),而不是atan2(y/x)。这一点很重要,因为如果不执行该部门,则会提供其他信息,最重要的是xy的个别信号。如果您分别知道xy坐标,则可以知道角度,包括象限。

如果您从tan(θ) = y/x转到sin(θ) = y/sqrt(x²+y²),则反向操作asin需要ysqrt(x²+y²)并将其组合以获取有关角度的一些信息。在这里,我们是自己执行除法还是让一些假设的asin2函数处理它并不重要。分母总是正的,因此分割的参数包含与单独的分子和分母包含的信息一样多的信息。 (至少在IEEE环境中,除以零会导致正确签名的无穷大。)

如果您知道y坐标和斜角sqrt(x²+y²),那么您就知道角度的正弦,但您无法知道角度本身,因为您无法区分负面和正面{{1} }值。同样,如果你知道x坐标和hypothenuse,你知道角度的余弦,但你不知道x值的符号。

所以yasin2在数学上是不可行的,至少不是以明显的方式。如果你将某种符号编码到连字符中,事情可能会有所不同,但我认为这种符号不会自然出现。

答案 1 :(得分:0)

我将在简单条款中进行解释。 See this image进行以下解释。

任务:选择一个可以在-180 < θ < 180范围内跟踪正确角度的函数

审判1: sin()在第一象限和第二象限sin(30) = sin(150) = 0.5中为正。使用sin()来跟踪象限变化并不容易。

因此,asin2()不可行。

试用2: cos()在第一和第四象限cos(60) = sin(300) = 0.5中为正。此外,使用cos()来跟踪象限变化也不容易。

因此,acos2()也不可行。

试验3: tan()在第一象限和第三象限中为正,并且以有趣的顺序排列。

在第一象限为正,在第二象限为负,在第三象限为正,在第四象限为负,在环绕的第一象限为正。

这样tan(45) = 1tan(135) = -1tan(225) = 1tan(315) = -1tan(360+45) = 1。欢呼!我们可以跟踪象限的变化。

请注意,明确范围是-180 < θ < 180。另外,请注意上面的45度增量示例,如果序列为1,-1,..,则角度为逆时针方向;如果序列为-1,1,..,则角度为顺时针方向。这个想法应该解决方向性。

因此,atan2() 成为我们的选择

答案 2 :(得分:0)

有时需要例如“ acos2”的功能,例如在3D空间中执行矢量旋转时。在这种情况下,我对自己的acos2函数进行了硬编码,该函数仅执行以下检查:

x_perp=sqrt(x*x+y*y)
r=sqrt(x*x+y*y+z*z)

if(x_perp.gt.0.0d0) then
phi=acos(x/x_perp)
else
phi=0.0d0
endif
if(y.lt.0.0d0) phi=2.0d0*pi-phi
theta=acos(z/r)

其中theta和phi是通常的球坐标,而x,y,z是笛卡尔坐标。当y为负数时,会出现问题,需要在phi中进行相移。 θ没有这样的问题。

答案 3 :(得分:0)

因为asin(y,x) acos(y,x)将分别使用与atan(y,x)相同的参数,并且将给出相同的答案。每个函数都同样有效,但是我们只需要一个这样的函数。

不确定性源自(atan2)的名称。它的功能是given x and y, computes the angle(由原点到该点的直线制成)的x轴为正。像angle_from(x,y)这样的名称可能更合适。