C++11标准模板(STL)- 常用数学函数 - 计算反正切,以符号确定象限(std::atan2, std::atan2f, std::atan2l)
常用数学函数
计算反正切,以符号确定象限
std::atan2,
std::atan2f,
std::atan2l
定义于头文件 | ||
float atan2f( float y, float x ); | (1) | (C99 起) |
double atan2( double y, double x ); | (2) | |
long double atan2l( long double y, long double x ); | (3) | (C99 起) |
定义于头文件 | ||
#define atan2( arg ) | (4) | (C99 起) |
1-3) 计算 y/x
的弧(反)正切,以参数符号确定正确的象限。
4) 泛型宏:若任何参数拥有 long double 类型,则调用 atan2l
。否则,若任何参数拥有整数类型或 double 类型,则调用 atan2
。否则调用 atan2f
。
参数
x, y | - | 浮点值 |
返回值
若不出现错误,则返回 y/x
在 [-π ; +π] 弧度范围中的弧(反)正切( arctan(
y |
x |
) )。
Y 参数
返回值
X 参数
若出现定义域错误,则返回实现定义值。
若出现下溢所致的值域错误,则返回(舍入后的)正确结果。
错误处理
报告 math_errhandling 中指定的错误。
若 x
与 y
均为零则可能出现定义域错误。
若实现支持 IEEE 浮点算术( IEC 60559 ),则
- 若
x
与y
均为零,则定义域错误不出现 - 若
x
与y
均为零,则也不出现值域错误 - 若
y
为零,则不出现极点错误 - 若
y
为±0
且x
为负或-0
,则返回±π
- 若
y
为±0
且x
为正或+0
,则返回±0
- 若
y
为±∞
且x
有限,则返回±π/2
- 若
y
为±∞
且x
为-∞
,则返回±3π/4
- 若
y
为±∞
且x
为+∞
,则返回±π/4
- 若
x
为±0
且y
为负,则返回-π/2
- 若
x
为±0
且y
为正,则返回+π/2
- 若
x
为-∞
且y
为正有限,则返回+π
- 若
x
为-∞
且y
为负有限,则返回-π
- 若
x
为+∞
且y
为正有限,则返回+0
- 若
x
为+∞
且y
为负有限,则返回-0
- 若
x
为 NaN 或y
为 NaN ,则返回 NaN
注意
atan2(y, x) 等价于 carg(x + I*y) 。
POSIX 指定在下溢情况下,返回不修改的 arg
,而若不支持如此,则返回不大于 DBL_MIN 、 FLT_MIN 和 LDBL_MIN 的实现定义值。
调用示例
#include <iostream>
#include <cstdlib>
#include <typeinfo>
#include <cinttypes>
#include <cmath>
#include <math.h>
#include <tgmath.h>int main()
{//1-3) 计算 y/x 的弧(反)正切,以参数符号确定正确的象限。const float fNumber = std::acos(-1);std::cout << "typeid(float).name(): " << typeid(float).name() << std::endl;for (int i = 1; i <= 10; i += 1){std::cout << "(" << fNumber / i << ", " << fNumber / i + 1 << ") cartesian "<< "std::atan2(" << fNumber / i << ", " << fNumber / i + 1 << "): "<< std::atan2(fNumber / i, fNumber / i + 1) << std::endl;}std::cout << std::endl;for (int i = 1; i <= 10; i += 1){std::cout << "(" << fNumber / i - 1 << ", " << fNumber / i << ") cartesian "<< "std::atan2(" << fNumber / i - 1 << ", " << fNumber / i << "): "<< std::atan2(fNumber / i - 1, fNumber / i) << std::endl;}std::cout << std::endl;const double dNumber = std::acos(-1);std::cout << "typeid(double).name(): " << typeid(double).name() << std::endl;for (int i = 1; i <= 10; i += 1){std::cout << "(" << dNumber / i << ", " << dNumber / i + 2 << ") cartesian "<< "std::atan2(" << dNumber / i << ", " << dNumber / i + 2 << "): "<< std::atan2(dNumber / i, dNumber / i + 2) << std::endl;}std::cout << std::endl;for (int i = 1; i <= 10; i += 1){std::cout << "(" << dNumber / i - 2 << ", " << dNumber / i << ") cartesian "<< "std::atan2(" << dNumber / i - 2 << ", " << dNumber / i << "): "<< std::atan2(dNumber / i - 2, dNumber / i) << std::endl;}std::cout << std::endl;const long double ldNumber = std::acos(-1);std::cout << "typeid(long double).name(): " << typeid(long double).name() << std::endl;for (int i = 1; i <= 10; i += 1){std::cout << "(" << ldNumber / i << ", " << ldNumber / i + 3 << ") cartesian "<< "std::atan2(" << ldNumber / i << ", " << ldNumber / i + 3 << "): "<< std::atan2(ldNumber / i, ldNumber / i + 3) << std::endl;}std::cout << std::endl;for (int i = 1; i <= 10; i += 1){std::cout << "(" << ldNumber / i - 3 << ", " << ldNumber / i << ") cartesian "<< "std::atan2(" << ldNumber / i - 3 << ", " << ldNumber / i << "): "<< std::atan2(ldNumber / i - 3, ldNumber / i) << std::endl;}std::cout << std::endl;return 0;
}
输出
typeid(float).name(): f
(3.14159, 4.14159) cartesian std::atan2(3.14159, 4.14159): 0.648949
(1.5708, 2.5708) cartesian std::atan2(1.5708, 2.5708): 0.54848
(1.0472, 2.0472) cartesian std::atan2(1.0472, 2.0472): 0.472827
(0.785398, 1.7854) cartesian std::atan2(0.785398, 1.7854): 0.414424
(0.628319, 1.62832) cartesian std::atan2(0.628319, 1.62832): 0.368266
(0.523599, 1.5236) cartesian std::atan2(0.523599, 1.5236): 0.331015
(0.448799, 1.4488) cartesian std::atan2(0.448799, 1.4488): 0.300399
(0.392699, 1.3927) cartesian std::atan2(0.392699, 1.3927): 0.274834
(0.349066, 1.34907) cartesian std::atan2(0.349066, 1.34907): 0.253193
(0.314159, 1.31416) cartesian std::atan2(0.314159, 1.31416): 0.234653(2.14159, 3.14159) cartesian std::atan2(2.14159, 3.14159): 0.598331
(0.570796, 1.5708) cartesian std::atan2(0.570796, 1.5708): 0.348545
(0.0471976, 1.0472) cartesian std::atan2(0.0471976, 1.0472): 0.0450399
(-0.214602, 0.785398) cartesian std::atan2(-0.214602, 0.785398): -0.266729
(-0.371681, 0.628319) cartesian std::atan2(-0.371681, 0.628319): -0.534183
(-0.476401, 0.523599) cartesian std::atan2(-0.476401, 0.523599): -0.738236
(-0.551201, 0.448799) cartesian std::atan2(-0.551201, 0.448799): -0.887445
(-0.607301, 0.392699) cartesian std::atan2(-0.607301, 0.392699): -0.996794
(-0.650934, 0.349066) cartesian std::atan2(-0.650934, 0.349066): -1.07857
(-0.685841, 0.314159) cartesian std::atan2(-0.685841, 0.314159): -1.14126typeid(double).name(): d
(3.14159, 5.14159) cartesian std::atan2(3.14159, 5.14159): 0.54848
(1.5708, 3.5708) cartesian std::atan2(1.5708, 3.5708): 0.414424
(1.0472, 3.0472) cartesian std::atan2(1.0472, 3.0472): 0.331015
(0.785398, 2.7854) cartesian std::atan2(0.785398, 2.7854): 0.274834
(0.628319, 2.62832) cartesian std::atan2(0.628319, 2.62832): 0.234653
(0.523599, 2.5236) cartesian std::atan2(0.523599, 2.5236): 0.204578
(0.448799, 2.4488) cartesian std::atan2(0.448799, 2.4488): 0.181261
(0.392699, 2.3927) cartesian std::atan2(0.392699, 2.3927): 0.162674
(0.349066, 2.34907) cartesian std::atan2(0.349066, 2.34907): 0.147518
(0.314159, 2.31416) cartesian std::atan2(0.314159, 2.31416): 0.13493(1.14159, 3.14159) cartesian std::atan2(1.14159, 3.14159): 0.348545
(-0.429204, 1.5708) cartesian std::atan2(-0.429204, 1.5708): -0.266729
(-0.952802, 1.0472) cartesian std::atan2(-0.952802, 1.0472): -0.738236
(-1.2146, 0.785398) cartesian std::atan2(-1.2146, 0.785398): -0.996794
(-1.37168, 0.628319) cartesian std::atan2(-1.37168, 0.628319): -1.14126
(-1.4764, 0.523599) cartesian std::atan2(-1.4764, 0.523599): -1.22999
(-1.5512, 0.448799) cartesian std::atan2(-1.5512, 0.448799): -1.28916
(-1.6073, 0.392699) cartesian std::atan2(-1.6073, 0.392699): -1.33117
(-1.65093, 0.349066) cartesian std::atan2(-1.65093, 0.349066): -1.36243
(-1.68584, 0.314159) cartesian std::atan2(-1.68584, 0.314159): -1.38656typeid(long double).name(): e
(3.14159, 6.14159) cartesian std::atan2(3.14159, 6.14159): 0.472827
(1.5708, 4.5708) cartesian std::atan2(1.5708, 4.5708): 0.331015
(1.0472, 4.0472) cartesian std::atan2(1.0472, 4.0472): 0.253193
(0.785398, 3.7854) cartesian std::atan2(0.785398, 3.7854): 0.204578
(0.628319, 3.62832) cartesian std::atan2(0.628319, 3.62832): 0.17147
(0.523599, 3.5236) cartesian std::atan2(0.523599, 3.5236): 0.147518
(0.448799, 3.4488) cartesian std::atan2(0.448799, 3.4488): 0.129405
(0.392699, 3.3927) cartesian std::atan2(0.392699, 3.3927): 0.115235
(0.349066, 3.34907) cartesian std::atan2(0.349066, 3.34907): 0.103853
(0.314159, 3.31416) cartesian std::atan2(0.314159, 3.31416): 0.0945106(0.141593, 3.14159) cartesian std::atan2(0.141593, 3.14159): 0.0450399
(-1.4292, 1.5708) cartesian std::atan2(-1.4292, 1.5708): -0.738236
(-1.9528, 1.0472) cartesian std::atan2(-1.9528, 1.0472): -1.07857
(-2.2146, 0.785398) cartesian std::atan2(-2.2146, 0.785398): -1.22999
(-2.37168, 0.628319) cartesian std::atan2(-2.37168, 0.628319): -1.31182
(-2.4764, 0.523599) cartesian std::atan2(-2.4764, 0.523599): -1.36243
(-2.5512, 0.448799) cartesian std::atan2(-2.5512, 0.448799): -1.39666
(-2.6073, 0.392699) cartesian std::atan2(-2.6073, 0.392699): -1.4213
(-2.65093, 0.349066) cartesian std::atan2(-2.65093, 0.349066): -1.43987
(-2.68584, 0.314159) cartesian std::atan2(-2.68584, 0.314159): -1.45436