当前位置: 首页 > news >正文

C++11标准模板(STL)- 常用数学函数 - 计算反正切,以符号确定象限(std::atan2, std::atan2f, std::atan2l)

常用数学函数

计算反正切,以符号确定象限

std::atan2, 
std::atan2f, 
std::atan2l

定义于头文件 <math.h>

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 起)

定义于头文件 <tgmath.h>

#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 中指定的错误。

xy 均为零则可能出现定义域错误。

若实现支持 IEEE 浮点算术( IEC 60559 ),则

  • xy 均为零,则定义域错误不出现
  • xy 均为零,则也不出现值域错误
  • y 为零,则不出现极点错误
  • y±0x 为负或 -0 ,则返回 ±π
  • y±0x 为正或 +0 ,则返回 ±0
  • y±∞x 有限,则返回 ±π/2
  • y±∞x-∞ ,则返回 ±3π/4
  • y±∞x+∞ ,则返回 ±π/4
  • x±0y 为负,则返回 -π/2
  • x±0y 为正,则返回 +π/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


http://www.mrgr.cn/news/45129.html

相关文章:

  • 招联金融2025秋招内推
  • 华为OD机试 - 优雅子数组 - 暴力枚举(Python/JS/C/C++ 2024 E卷 100分)
  • 六、索引的数据结构
  • 云计算Openstack Horizon
  • YOLO11改进|注意力机制篇|引入矩形自校准模块RCM
  • 微信小程序——音乐播放器
  • Python GUI 编程:tkinter 初学者入门指南——单行文本框
  • python 函数圈复杂度
  • Windows 安装 Maven 并配置环境变量
  • Java数据结构栈和队列(Stack和Queue详解)
  • 系统架构设计师教程 第14章 14.3 云原生架构相关技术 笔记
  • 网页前端开发之Javascript入门篇(8/9):数组
  • LabVIEW提高开发效率技巧----阻塞时钟
  • SQL专项练习第五天
  • Python OpenCV精讲系列 - 动态场景分析深入理解(十六)
  • python3 venv的使用详解
  • 冥想第一千三百零三天(1303)
  • TCN-Transformer时间序列预测(多输入单预测)——基于Pytorch框架
  • 基于时频分析与自适应滤波技术的多分量雷达信号提取与重建研究
  • Stable Diffusion最新版nowebui的api使用详解