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