常用数学函数
计算反正切 (arctan(x))
std::atan,
std::atanf,
std::atanl
定义于头文件 | ||
float atanf( float arg ); | (1) | (C99 起) |
double atan( double arg ); | (2) | |
long double atanl( long double arg ); | (3) | (C99 起) |
定义于头文件 | ||
#define atan( arg ) | (4) | (C99 起) |
1-3) 计算 arg
的弧(反)正切主值。
4) 泛型宏:若参数拥有 long double 类型,则调用 atanl
。否则,若参数拥有整数类型或 double 类型,则调用 atan
。否则调用 atanf
。若参数为复数,则宏调用对应的复数函数( catanf 、 catan 、 catanl )。
参数
arg | - | 浮点值 |
返回值
若不出现错误,则返回 arg
在 [-
π |
2 |
; +
π |
2 |
] 弧度范围中的弧(反)正切( arctan(arg) )。
若出现下溢所致的值域错误,则返回(舍入后的)正确结果。
错误处理
报告 math_errhandling 中指定的错误。
若实现支持 IEEE 浮点算术( IEC 60559 ),则
- 若参数为 ±0 ,则返回不修改的参数
- 若参数为 +∞ ,则返回 +π/2
- 若参数为 -∞ ,则返回 -π/2
- 若参数为 NaN ,则返回 NaN
注意
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) 计算 arg 的弧(反)正切主值。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 << "std::atan(" << fNumber / i << "): "<< std::atan(fNumber / i) << std::endl;}std::cout << std::endl;for (int i = 1; i <= 10; i += 1){std::cout << "std::atan(" << - fNumber / i << "): "<< std::atan(- fNumber / i) << std::endl;}std::cout << std::endl;const double dNumber = std::acos(-1);for (int i = 1; i <= 10; i += 1){std::cout << "std::atan(" << dNumber / i << "): "<< std::atan(dNumber / i) << std::endl;}std::cout << std::endl;for (int i = 1; i <= 10; i += 1){std::cout << "std::atan(" << - dNumber / i << "): "<< std::atan(- 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 << "std::atan(" << ldNumber / i << "): "<< std::atan(ldNumber / i) << std::endl;}std::cout << std::endl;for (int i = 1; i <= 10; i += 1){std::cout << "std::atan(" << - ldNumber / i << "): "<< std::atan(- ldNumber / i) << std::endl;}std::cout << std::endl;return 0;
}
输出
typeid(float).name(): f
std::atan(3.14159): 1.26263
std::atan(1.5708): 1.00388
std::atan(1.0472): 0.808449
std::atan(0.785398): 0.665774
std::atan(0.628319): 0.560982
std::atan(0.523599): 0.482348
std::atan(0.448799): 0.421855
std::atan(0.392699): 0.374197
std::atan(0.349066): 0.335842
std::atan(0.314159): 0.304396std::atan(-3.14159): -1.26263
std::atan(-1.5708): -1.00388
std::atan(-1.0472): -0.808449
std::atan(-0.785398): -0.665774
std::atan(-0.628319): -0.560982
std::atan(-0.523599): -0.482348
std::atan(-0.448799): -0.421855
std::atan(-0.392699): -0.374197
std::atan(-0.349066): -0.335842
std::atan(-0.314159): -0.304396std::atan(3.14159): 1.26263
std::atan(1.5708): 1.00388
std::atan(1.0472): 0.808449
std::atan(0.785398): 0.665774
std::atan(0.628319): 0.560982
std::atan(0.523599): 0.482348
std::atan(0.448799): 0.421855
std::atan(0.392699): 0.374197
std::atan(0.349066): 0.335842
std::atan(0.314159): 0.304396std::atan(-3.14159): -1.26263
std::atan(-1.5708): -1.00388
std::atan(-1.0472): -0.808449
std::atan(-0.785398): -0.665774
std::atan(-0.628319): -0.560982
std::atan(-0.523599): -0.482348
std::atan(-0.448799): -0.421855
std::atan(-0.392699): -0.374197
std::atan(-0.349066): -0.335842
std::atan(-0.314159): -0.304396typeid(long double).name(): e
std::atan(3.14159): 1.26263
std::atan(1.5708): 1.00388
std::atan(1.0472): 0.808449
std::atan(0.785398): 0.665774
std::atan(0.628319): 0.560982
std::atan(0.523599): 0.482348
std::atan(0.448799): 0.421855
std::atan(0.392699): 0.374197
std::atan(0.349066): 0.335842
std::atan(0.314159): 0.304396std::atan(-3.14159): -1.26263
std::atan(-1.5708): -1.00388
std::atan(-1.0472): -0.808449
std::atan(-0.785398): -0.665774
std::atan(-0.628319): -0.560982
std::atan(-0.523599): -0.482348
std::atan(-0.448799): -0.421855
std::atan(-0.392699): -0.374197
std::atan(-0.349066): -0.335842
std::atan(-0.314159): -0.304396