C++中atan(y/x)与atan2(y,x)函数的区别

C++提供了两个求反正切的函数atan(y/x),atan2(y,x),本文详细解释了二者的区别,以防大家用混。

atan(y/x)函数

atan(y/x)函数用以求取y/x的反正切(注意atan只有一个输入参数),返回值的单位为弧度,返回值的取值范围为 [-\pi/2,\pi/2]

  • 当y=x=0时返回值为NaN;
  • 当y/x为0时返回值为0;
  • 当y/x为正时返回值在 (0,\pi/2] 之间;
  • 当y/x为负时返回值在 [-\pi/2,0) 之间;

atan2(y,x)函数

atan2(y,x)函数用以求取y/x的反正切(注意atan2有两个输入参数),返回值的单位为弧度,返回值的取值范围为 (-\pi,\pi]

  • 当y=x=0时返回值为0;
  • 当y=0,x>0时返回值为0;
  • 当x>0且y>0时返回值在 (0,\pi/2) 之间;
  • 当x=0且y>0时返回值为 \pi/2
  • 当x<0且y>0时返回值在 (\pi/2,\pi) 之间;
  • 当y=0,x<0时返回值为 \pi ;
  • 当x<0且y<0时返回值在 (-\pi,-\pi/2) 之间;
  • 当x=0且y<0时返回值为 -\pi/2
  • 当x>0且y<0时返回值在 (-\pi/2,0) 之间;

测试代码

#include <algorithm>
#include <iostream>

using namespace std;

const double M_PI = 3.141592653589793238463;

double RadianToDegree(double radian)
{
    return radian * 180.0 / M_PI;
}

void TestAtan2()
{
    cout << "Printing the result of atan2():" << endl;

    double x = 0.0;
    double y = 0.0;
    cout << "\tatan2(0,0) = " << RadianToDegree(atan2(y, x)) << endl;

    x = 1.0;
    y = 0.0;
    cout << "\tatan2(0,1) = " << RadianToDegree(atan2(y, x)) << endl;

    x = 1.0;
    y = 1.0;
    cout << "\tatan2(1,1) = " << RadianToDegree(atan2(y, x)) << endl;

    x = 0.0;
    y = 1.0;
    cout << "\tatan2(1,0) = " << RadianToDegree(atan2(y, x)) << endl;

    x = -1.0;
    y = 1.0;
    cout << "\tatan2(1,-1) = " << RadianToDegree(atan2(y, x)) << endl;

    x = -1.0;
    y = 0.0;
    cout << "\tatan2(0,-1) = " << RadianToDegree(atan2(y, x)) << endl;

    x = -1.0;
    y = -1.0;
    cout << "\tatan2(-1,-1) = " << RadianToDegree(atan2(y, x)) << endl;

    x = 0.0;
    y = -1.0;
    cout << "\tatan2(-1,0) = " << RadianToDegree(atan2(y, x)) << endl;

    x = 1.0;
    y = -1.0;
    cout << "\tatan2(-1,1) = " << RadianToDegree(atan2(y, x)) << endl;
}

void TestAtan()
{
    cout << "Printing the result of atan():" << endl;

    double x = 0.0;
    double y = 0.0;
    cout << "\tatan(0/0) = " << RadianToDegree(atan(y / x)) << endl;

    x = 1.0;
    y = 0.0;
    cout << "\tatan(0/1) = " << RadianToDegree(atan(y / x)) << endl;

    x = 1.0;
    y = 1.0;
    cout << "\tatan(1/1) = " << RadianToDegree(atan(y / x)) << endl;

    x = 0.0;
    y = 1.0;
    cout << "\tatan(1/0) = " << RadianToDegree(atan(y / x)) << endl;

    x = -1.0;
    y = 1.0;
    cout << "\tatan(1/-1) = " << RadianToDegree(atan(y / x)) << endl;

    x = -1.0;
    y = 0.0;
    cout << "\tatan(0/-1) = " << RadianToDegree(atan(y / x)) << endl;

    x = -1.0;
    y = -1.0;
    cout << "\tatan(-1/-1) = " << RadianToDegree(atan(y / x)) << endl;

    x = 0.0;
    y = -1.0;
    cout << "\tatan(-1/0) = " << RadianToDegree(atan(y / x)) << endl;

    x = 1.0;
    y = -1.0;
    cout << "\tatan(-1/1) = " << RadianToDegree(atan(y / x)) << endl;
}

int main()
{
    TestAtan2();
    TestAtan();
    return 0;
}

测试代码输出结果

编辑于 2021-10-29 08:42