C 对这个函数背后的数学有点困惑

C 对这个函数背后的数学有点困惑,c,math,C,Math,所以我一直在研究这个函数,它将笛卡尔坐标转换成极坐标,还有if语句,如果x==0,y>0,那么θ==pi/2 然而,如果要计算θ,它只需遵循以下形式: theta = atan(y/x). 让我困惑的是,如果x==0这个函数立即未定义?因为你要除以0,所以应该趋于无穷大,对吗 那么,在这个函数中,它如何表示,如果x==0,y>0,它总是等于pi/2 这可能是很基本的,我只是把它复杂化了很多 提前谢谢 void carttopolar(float x, float y, double *radp

所以我一直在研究这个函数,它将笛卡尔坐标转换成极坐标,还有if语句,如果x==0,y>0,那么θ==pi/2

然而,如果要计算θ,它只需遵循以下形式:

theta = atan(y/x).
让我困惑的是,如果
x==0
这个函数立即未定义?因为你要除以
0
,所以应该趋于无穷大,对吗

那么,在这个函数中,它如何表示,如果
x==0,y>0,它总是等于pi/2

这可能是很基本的,我只是把它复杂化了很多

提前谢谢

void carttopolar(float x, float y, double *radptr, double *thetaptr){
    float theta;
    *radptr = sqrt(x * x + y * y);
    if(x==0){
        if(y==0){
            theta = 0.0;
        }
        else if(y>0){
            theta = M_PI_2;
        }
        else{
            theta = -M_PI_2;
        }
    }
    else{
        theta = atan(y/x);
    }
    *thetaptr = theta;
}

这个代码假设任何正数除以零就是正无穷大,任何负数除以零就是负无穷大。这是一些特殊情况,因为除以零在C中没有任何用处。

重点是atan是tan的倒数,tan确实在某些点上生成无穷大的值,如下图:

这段代码捕捉到这样的情况:将一个无穷大参数输入atan,并返回给出无穷大的角度(+/-pi/2分别给出正无穷大或负无穷大)


普遍接受的方法是只使用atan2函数。

始终使用pi/2或-pi/2的原因是极坐标的定义。极点用P(r,Phi)表示。因此,如果X为0(y!=0),唯一的可能性是90°和270°=>PI/2和-PI/2

Y轴上的距离由“r”定义

另见:

::编辑::


添加:“和y!=0”,ty chux

您可能会将此函数与
切线
函数混淆。这个计算一个点在笛卡尔坐标系中的极坐标。考虑使用<代码> ATAN2代替,定义在R的处处,除以0是不好的,它不会给你一个有用的答案…如果x==0,则θ将是-M_PI_2或M_PI_2,具体取决于y@GradyPlayer:
atan2()
出现在第7版UNIX中™ (大约1979年),在C89,以及C99和C11中。@Bentoy13
atan2()
是一条路要走,但是IIR对于
atan2(+/-0,+/-0)
没有很好的定义;当然这就是我要找的。完全忘记了这一点。“因此,如果X为0,那么唯一的可能性是90°和270°=>PI/2和-PI/2”忽略了
X
y
都为+/-0.0时的角情况。“如果两个参数均为零,则可能发生域错误。”C11dr§7.12.4.4 2