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

Why are there no asin2() and acos2() functions similar to atan2()?

根据我的理解,atan2() 函数存在于编程语言中,因为 atan() 本身无法始终确定正确的 theta,因为输出仅限于 -pi/2 到 pi/2.

如果是这样,那么asin()acos()也是同样的问题,两者也有限制范围,那为什么没有asin2()acos2() 功能?

首先,请注意两个arctan 函数的语法是atan(y/x)atan2(y, x)。这种区别很重要,因为不执行除法会提供额外的信息,最重要的是 xy 的各个符号。如果您知道单独的 xy 坐标,则可以找到 atan 函数的特定解(即考虑到 (x,y) 所在象限的解).

如果你从 tan(θ) = y/xsin(θ) = y/sqrt(x²+y²),那么逆运算 asin 需要 ysqrt(x²+y²) 并结合它们以获得关于角度。在这里,我们自己执行除法还是让某个假设的 asin2 函数处理它并不重要。分母始终为正,因此除法参数包含的信息与单独的分子和分母包含的信息一样多。 (至少在 IEEE 环境中,除以零会导致正确签名的无穷大。)

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

所以asin2acos2在数学上是不可行的,至少不是以明显的方式。如果你将某种符号编码到假设中,情况可能会有所不同,但我想不出这种符号会自然出现的情况。

我会在简单条款中这样解释。
请参阅此图片以获取以下解释:

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

试验 1: sin()在第一象限和第二象限都是正数,sin(30) = sin(150) = 0.5。使用 sin().

跟踪象限变化并不容易

因此asin2()不可行

试验二: 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()成为我们的选择

有时需要像 "acos2" 这样的函数,例如在 3D 中执行矢量旋转时 space。在这种情况下,我对自己的 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 需要相移。 theta不存在这个问题。

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

(atan2的)名字不明。它是 given x and y, computes the angle(由从原点到这一点的一条直线)与(正)x 轴的函数。 angle_from(x,y) 这样的名字可以说更合适。