首页 > 其他分享 >【C】标准库中 atan, atan2 有什么不同

【C】标准库中 atan, atan2 有什么不同

时间:2023-06-18 11:22:53浏览次数:27  
标签:pi atan 象限 atan2 库中 PI 取值

一. 最直接的不同是 atan 只接收一个参数, atan2 可以接收两个参数。 二. 两者的值域也不一样:

  1. 对于tan(θ) = y / x: θ = ATan(y / x)求出的θ取值范围是[-PI/2, PI/2]。 θ = ATan2(y, x)求出的θ取值范围是[-PI, PI]。
    • 当 (x, y) 在第一象限, 0 < θ < PI/2.
    • 当 (x, y) 在第二象限 PI/2 < θ≤PI.
    • 当 (x, y) 在第三象限, -PI < θ < -PI/2.
    • 当 (x, y) 在第四象限, -PI/2 < θ < 0.
  2. 当点(x, y)在象限的边界也就是坐标轴上时:
    • 当 y 是 0,x 为非负值, θ = 0.
    • 当 y 是 0, x 是 负值, θ = PI.
    • 当 y 是 正值, x 是 0, θ = PI/2.
    • 当 y 是 负值, x 是 0, θ = -PI/2.
  3. 由此可知,一般情况下用ATan即可,当对所求出角度的取值范围有特殊要求时,应使用ATan2。
  对于值域的进一步解释:   atan2(a,b)是4象限反正切,它的取值不仅取决于正切值a/b,还取决于点 (b, a) 落入哪个象限:    当点(b, a) 落入第一象限时,atan2(a,b)的范围是 0 ~ pi/2;  当点(b, a) 落入第二象限时,atan2(a,b)的范围是 pi/2 ~ pi;    当点(b, a) 落入第三象限时,atan2(a,b)的范围是 -pi~-pi/2;  当点(b, a) 落入第四象限时,atan2(a,b)的范围是 -pi/2~0   而 atan(a/b) 仅仅根据正切值为a/b求出对应的角度 (可以看作仅仅是2象限反正切):    当 a/b > 0 时,atan(a/b)取值范围是 0 ~ pi/2;    当 a/b < 0 时,atan(a/b)取值范围是 -pi/2~0   故 atan2(a,b) = atan(a/b) 仅仅发生在 点 (b, a) 落入第一象限 (b>0, a>0)或 第四象限(b>0, a<0)。当点 (b, a) 落入第二、三象限时,很显然atan2(a,b) 不等于 atan(a/b) ,并且atan2(a,b)也不可能等于 2*atan(a/b) 。这是因为,假如点 (b, a) 落入第二象限,则 a/b<0,  故atan(a/b)取值范围始终是 -pi/2~0,2*atan(a/b) 的取值范围是-pi~0,然而,atan2(a,b)的范围是 pi/2 ~ pi,故不可能有atan2(a,b) = 2*atan(a/b) 。假如点(b, a) 落入第三象限,则则 a/b>0 , 故 atan(a/b) 取值范围是 0 ~ pi/2,2*atan(a/b) 的取值范围是 0 ~ pi,而此时atan2(a,b)的范围是 -pi~-pi/2,很显然,atan2(a,b) = 2*atan(a/b)    举个最简单的例子,a = 1, b = -1,则 atan(a/b) = atan(-1) = -pi/4, 而 atan2(a,b) = 3*pi/4

标签:pi,atan,象限,atan2,库中,PI,取值
From: https://www.cnblogs.com/beautiful-scenery/p/17488854.html

相关文章

  • 在FreeSWITCH中使用Lua脚本来将电话记录存储到MySQL数据库中
    在FreeSWITCH中使用Lua脚本来将电话记录存储到MySQL数据库中,需要做以下几个步骤:安装MySQL客户端库首先需要通过包管理器(如apt-get或yum)安装MySQL客户端库,以便FreeSWITCH能够与MySQL数据库进行通信。例如,在Ubuntu系统中,可以运行以下命令进行安装:sudoapt-getinstalllibmysq......
  • 第一次初始化项目到git的本地仓库中
    首先创建一个文件夹用来放不同的项目在创建的文件夹中将自己的项目复制进去打开自己的项目,右键鼠标点击GitBashHere首先设置用户名和邮箱gitconfig--globaluser.name用户名gitconfig--globaluser.email邮箱输入gitinit初始化项目将工作区的所......
  • 数据库中数据挖掘的基本技术介绍
    随着数据库技术的不断发展及数据库管理系统的广泛应用,数据库中存储的数据量急剧增大,在大量的数据背后隐藏着许多重要的信息,如果能把这些信息从数据库中抽取出来,将为公司创造很多潜在的利润,而这种从海量数据库中挖掘信息的技术,就称之为数据挖掘。数据挖掘工具能够对将来的趋势......
  • 性能测试-批量向数据库中构造数据(10万条)
    通过存储过程向数据库sys_member表中插入10万条数据:向苏汽系统中Mysql插入批量数据(构造10万条数据):第1种方法:通过存储过程实现DROPPROCEDUREIFEXISTSmy_insert;CREATEPROCEDUREmy_insert()BEGINDECLAREnintDEFAULT0;loopname:LOOPinse......
  • [c++实践]关于标准库中字符串的高效处理
    [c++实践]关于标准库中字符串的高效处理无论什么程序,都需要大量的使用字符串,c++标准库提供了std::string对字符串进行处理。熟悉std::string实现逻辑的都知道,std::string库比较耗时的操作主要在内存的分配与字符串的拼接。因为内存分配实际上还是使用的malloc,但是在多线程......
  • 在 VS Code 中使用 GitHub Actions 以及 在仓库中创建一个 .github/workflows 目录
    在VSCode中使用GitHubActions需要完成以下步骤:1.首先,需要在GitHub上创建一个仓库,并在仓库中创建一个`.github/workflows`目录,用于存放GitHubActions的工作流文件。2.在VSCode中打开该仓库,并在左侧的“资源管理器”中选择`.github/workflows`目录。3.右键......
  • 在数据库中,如何将时间戳转换成相应的年,月,日
    在软件开发过程中,我们会经常用到数据库,但是每个数据库之间都用各自的特点! 一、MYSQL在MySQL数据库中,可以使用DATE_FORMAT函数将时间戳转换为指定格式的日期字符串,并再使用相关函数将其转换为年份或月份。具体方法如下:转换成年份使用以下SQL语句将时间戳字段order_date转换......
  • C标准库中srand()和rand()关于随机数的记录
    首先需要说明,C标准库可以在C++中使用。srand()和rand()均来源于<cstdlib>中。因为这两个函数只能生成相对随机的伪随机数(有规律的随机数),这种不能直接实现“绝对随机”的函数一开始会给大家带来一些疑惑。下面记录了一些关于srand()和rand()的使用方法,以及如何实现伪随机数的“绝......
  • winfrom中对datagridview控件更新数据并添加到数据库中
    第一种方法:双击鼠标直接修改数据同步到数据库1、首先在app.config配置数据库<?xmlversion="1.0"encoding="utf-8"?><configuration>   <connectionStrings>      <addname="local"         connectionString="DataSource=DESKTOP-H......
  • Katana:一款功能强大的下一代网络爬虫框架
    关于KatanaKatana是一款功能强大的下一代网络爬虫框架,在该工具的帮助下,广大研究人员可以轻松完成资源爬取和渗透测试阶段的信息收集任务。功能介绍1、快速且完全可配置的网络资源爬取;2、支持标准模式和Headless模式;3、JavaScript解析/爬取;4、可自定义的自动化表单填充;5、范......