【C语言标准库函数】三角函数
目录
一、头文件
二、函数简介
2.1. 正弦函数:sin(double angle)
2.2. 余弦函数:cos(double angle)
2.3. 正切函数:tan(double angle)
2.4. 反正弦函数:asin(double value)
2.5. 反余弦函数:acos(double value)
2.6. 反正切函数:atan(double value)
2.7. atan2函数:atan2(double y, double x)
三、函数实现
3.1. sin(), cos(), tan() 的伪代码(基于泰勒级数)
3.2. asin(), acos(), atan() 的伪代码
3.3. atan2() 的伪代码
四、注意事项
4.1. 包含头文件
4.2. 参数类型与单位
4.3. 返回值
4.4. 精度问题
4.5. 特殊值处理
4.6. 链接数学库
4.7. 函数范围
五、示例代码
在 C 语言标准库中,提供了一系列用于处理三角函数运算的函数,这些函数位于 <math.h>
头文件中。
一、头文件
C语言中的三角函数定义在math.h
(或C++中的cmath
)头文件中。因此,在使用这些函数之前,需要包含这个头文件:
#include <math.h>
二、函数简介
以下是C语言标准库中常见的三角函数。
2.1. 正弦函数:sin(double angle)
- 功能:计算给定弧度角的正弦值。
- 参数:
angle
表示以弧度为单位的角。 - 返回值:返回角的正弦值,类型为
double
。
2.2. 余弦函数:cos(double angle)
- 功能:计算给定弧度角的余弦值。
- 参数:
angle
表示以弧度为单位的角。 - 返回值:返回角的余弦值,类型为
double
。
2.3. 正切函数:tan(double angle)
- 功能:计算给定弧度角的正切值。
- 参数:
angle
表示以弧度为单位的角。 - 返回值:返回角的正切值,类型为
double
。
2.4. 反正弦函数:asin(double value)
- 功能:计算给定正弦值的反正弦值(以弧度为单位)。
- 参数:
value
表示正弦值,范围在-1到1之间。 - 返回值:返回对应的角度的反正弦值,类型为
double
,范围在-π/2到π/2之间。
2.5. 反余弦函数:acos(double value)
- 功能:计算给定余弦值的反余弦值(以弧度为单位)。
- 参数:
value
表示余弦值,范围在-1到1之间。 - 返回值:返回对应的角度的反余弦值,类型为
double
,范围在0到π之间。
2.6. 反正切函数:atan(double value)
- 功能:计算给定正切值的反正切值(以弧度为单位)。
- 参数:
value
表示正切值。 - 返回值:返回对应的角度的反正切值,类型为
double
,范围在-π/2到π/2之间。
2.7. atan2函数:atan2(double y, double x)
- 功能:计算y/x的反正切值,但考虑x和y的符号来确定正确的象限。
- 参数:
y
是点的y坐标,x
是点的x坐标。 - 返回值:返回的角度范围在-π到π之间,类型为
double
。这个函数特别有用,因为它可以自动处理四个象限的情况。
三、函数实现
C标准库中的三角函数(如sin()
, cos()
, tan()
, asin()
, acos()
, atan()
, atan2()
)是由编译器的实现者提供的,它们通常基于复杂的数学算法(如CORDIC算法、泰勒级数、查找表等)来优化性能和精度。直接给出这些函数的完整实现可能会非常复杂且冗长。不过,我们可以提供一些伪代码或简化的概念来解释这些函数是如何工作的,特别是从算法的角度。但请注意,这些伪代码并不是实际可用的C代码,而是用于说明目的。
3.1. sin(), cos(), tan() 的伪代码(基于泰勒级数)
泰勒级数是一种将函数表示为无限项和的方法,对于三角函数,我们可以使用它们的泰勒级数来近似计算它们的值。但请注意,实际实现可能会使用更高效的算法。
function sin(x in radians): # 泰勒级数的一个非常简化的版本 # 注意:实际实现会使用更多的项,并考虑精度和性能 sum = 0 term = x n = 1 while |term| > epsilon: # epsilon 是某个很小的数,用于控制精度 sum += term term = -term * x * x / ((2 * n) * (2 * n + 1)) n += 1 return sum # cos() 和 tan() 的泰勒级数也可以类似地定义,但它们的系数和项的结构不同 # 注意:以上伪代码仅用于说明目的,并不准确,因为:
# 1. 泰勒级数需要更多的项才能达到合理的精度。
# 2. 对于tan(x),直接使用泰勒级数可能会遇到除以零的问题(当x=k*π, k为整数时)。
# 3. 实际实现可能会使用CORDIC算法、查找表或其他更高效的方法。
3.2. asin(), acos(), atan() 的伪代码
这些函数通常通过某种形式的迭代或查找表来近似计算。但它们的直接实现比sin()
, cos()
, tan()
更复杂,因为它们需要解决非线性方程。
function asin(x): # 伪代码,实际实现会更复杂 # 可能会使用牛顿迭代法或其他数值方法来逼近解 # 这里只是概念上的说明 result = 0 # 初始猜测 # 迭代过程(伪代码) while not_converged(result, x): # 计算新的迭代值,这里省略了具体的迭代公式 new_result = iterate(result, x) result = new_result return result # acos() 和 atan() 类似,但它们的迭代公式和初始猜测可能不同
3.3. atan2() 的伪代码
atan2()
函数特别用于处理两个坐标值(y, x),并返回从x轴正方向到点(x, y)的向量与x轴正方向之间的角度(以弧度为单位),考虑了所有四个象限。
function atan2(y, x): if x > 0: return atan(y / x) elif x < 0 and y >= 0: return atan(y / x) + π elif x < 0 and y < 0: return atan(y / x) - π elif x == 0 and y > 0: return π / 2 elif x == 0 and y < 0: return -π / 2 else: # x == 0 and y == 0 # 在数学上未定义,但在C标准中返回0 return 0 # 注意:实际实现中,atan2() 会直接计算而不需要分支,以提高性能和精度。
# 它可能使用CORDIC算法或其他技术来直接得出结果。
上面的伪代码仅用于说明目的,并且与实际的C标准库实现有很大不同。在实际应用中,应该直接使用C标准库提供的这些函数。
四、注意事项
C标准库中的三角函数(如sin()
, cos()
, tan()
, asin()
, acos()
, atan()
, atan2()
)是编程中常用的数学工具,但在使用时需要注意以下几点。
4.1. 包含头文件
- 使用这些函数之前,必须包含
<math.h>
头文件,因为三角函数的声明和宏定义都位于该头文件中。
4.2. 参数类型与单位
- 参数类型:这些函数通常接受
double
类型的参数。 - 单位:三角函数(
sin()
,cos()
,tan()
)的参数是以弧度为单位的。如果有一个以度数为单位的角,需要先将其转换为弧度。转换公式为:弧度 = 度数 * (π / 180)。
4.3. 返回值
- 这些函数返回一个
double
类型的值,表示计算结果。 - 对于
asin()
,acos()
,atan()
函数,返回值也是以弧度为单位的。
4.4. 精度问题
- 由于浮点数的表示和计算存在精度限制,这些函数的结果可能与理论上的精确值存在微小的差别。
- 在比较函数返回值时,应考虑使用一个足够小的容差来判断两个浮点数是否相等。
4.5. 特殊值处理
- 当输入参数为NaN(不是一个数字)或无穷大时,这些函数可能返回NaN或特殊值(如
acos()
和asin()
在输入超出范围时返回NaN)。 - 某些函数在特定输入下可能有定义好的行为,如
atan2(0, 0)
在C标准中未定义,但许多实现会返回0。
4.6. 链接数学库
- 在编译使用这些函数的程序时,需要链接数学库。对于GCC编译器,通常使用
-lm
选项来链接数学库。
4.7. 函数范围
asin()
和acos()
函数的参数必须在-1到1之间,超出这个范围将返回NaN。atan()
和atan2()
函数没有这样的参数范围限制,但atan()
的返回值范围限制在-π/2到π/2之间。atan2()
函数通过考虑两个参数的符号来确定正确的象限,返回值的范围在-π到π之间。
五、示例代码
#include <stdio.h>
#include <math.h> int main() { double radians = M_PI / 4; // 45度的弧度值 double sine, cosine, tangent, arcsine, arccosine, arctangent; sine = sin(radians); cosine = cos(radians); tangent = tan(radians); arcsine = asin(sine); arccosine = acos(cosine); arctangent = atan(tangent); // atan2示例 double y = 1.0, x = 1.0; double angle = atan2(y, x); // 45度或π/4弧度 printf("sin(%f) = %f\n", radians, sine); printf("cos(%f) = %f\n", radians, cosine); printf("tan(%f) = %f\n", radians, tangent); printf("asin(%f) = %f\n", sine, arcsine); printf("acos(%f) = %f\n", cosine, arccosine); printf("atan(%f) = %f\n", tangent, arctangent); printf("atan2(%f, %f) = %f radians (%f degrees)\n", y, x, angle, angle * (180.0 / M_PI)); return 0;
}
我们计算了45度(π/4弧度)的正弦、余弦、正切值,以及它们的反正弦、反余弦、反正切值。我们还展示了如何使用atan2()
函数来计算两个坐标点之间的角度。注意,我们使用了M_PI
来表示π的值,它在math.h
中定义。
相关文章:

【C语言标准库函数】三角函数
目录 一、头文件 二、函数简介 2.1. 正弦函数:sin(double angle) 2.2. 余弦函数:cos(double angle) 2.3. 正切函数:tan(double angle) 2.4. 反正弦函数:asin(double value) 2.5. 反余弦函数:acos(double value)…...
CNN-day9-经典神经网络ResNet
day10-经典神经网络ResNet 1 梯度消失问题 深层网络有个梯度消失问题:模型变深时,其错误率反而会提升,该问题非过拟合引起,主要是因为梯度消失而导致参数难以学习和更新。 2 网络创新 2015年何凯明等人提出deep residual netw…...
淘宝分类详情数据获取:Python爬虫的高效实现
在电商领域,淘宝作为中国最大的电商平台之一,其分类详情数据对于市场分析、竞争对手研究以及电商运营优化具有不可估量的价值。通过Python爬虫技术,我们可以高效地获取这些数据,为电商从业者提供强大的数据支持。 一、为什么选择…...
机器学习 —— 深入剖析线性回归模型
一、线性回归模型简介 线性回归是机器学习中最为基础的模型之一,主要用于解决回归问题,即预测一个连续的数值。其核心思想是构建线性方程,描述自变量(特征)和因变量(目标值)之间的关系。简单来…...
33.日常算法
1.螺旋矩阵 题目来源 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] class Solution { public:vec…...

#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概述 二、漏洞复现步骤 三、技术…...

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命
目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展,部分内容有删除,与原文会有…...

Vision Transformer学习笔记(2020 ICLR)
摘要(Abstract):简述了ViT(Vision Transformer)模型的设计和实验结果,展示了其在大规模图像数据集上进行训练时的优越性能。该模型直接采用原始图像块作为输入,而不是传统的卷积神经网络(CNNs),并通过Transformer架构处理这些图像块以实现高效的图像识别。引言(Introdu…...
一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路
以下是一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路: 需求分析阶段核心功能梳理 音乐播放器(播放/暂停/进度条/音量)歌单分类(流行/古典/摇滚等)用户系统(登录/收藏/历史记录)搜索功能(歌曲/歌手/专辑)推荐系统(根据用户偏好推荐)技术选型 前端:微信…...

25/2/8 <机器人基础> 阻抗控制
1. 什么是阻抗控制? 阻抗控制旨在通过调节机器人与环境的相互作用,控制其动态行为。阻抗可以理解为一个力和位移之间的关系,涉及力、速度和位置的协同控制。 2. 阻抗控制的基本概念 力控制:根据感测的外力调节机械手的动作。位置…...
golang 开启HTTP代理认证
内部网路不能直接访问外网接口,可以通过代理发送HTTP请求。 HTTP代理服务需要进行认证。 package cmdimport ("fmt""io/ioutil""log""net/http""net/url""strings" )// 推送CBC07功能 func main() {l…...

详解Nginx no live upstreams while connecting to upstream
网上看到几个相关的文章,觉得很不错,这里整理记录分享一下,供大家参考。 upstream配置分 在分析问题原因之前,我们先来看下关于上面upstream配置一些相关的参数配置说明,参考下面表格 ngx_http_proxy_module 这里重…...

Open3d Qt的环境配置
Open3d Qt的环境配置 一、概述二、操作流程2.1 下载文件2.2 新建文件夹2.3 环境变量设置2.4 qt6 引用3、qt中调用4、资源下载一、概述 目前统一使用qt6配置,open3d中可视化功能目前使用vtk代替,语言为c++。 二、操作流程 2.1 下载文件 访问open3d github链接,进入releas…...
5.Python字典和元组:字典的增删改查、字典遍历、访问元组、修改元组、集合(set)
1. 字典(dict) 字典是一个无序的键值对集合,每个键对应一个值。 字典的增、删、改、查: 添加键值对: my_dict {a: 1, b: 2} my_dict[c] 3 # 添加新键c,值为3 print(my_dict) # 输出:{a: 1, b: 2, c: …...

深度学习系列--04.梯度下降以及其他优化器
目录 一.梯度概念 1.一元函数 2.二元函数 3.几何意义上的区别 二.梯度下降 1.原理 2.步骤 3.示例代码(Python) 4.不同类型的梯度下降 5.优缺点 三.动量优化器(Momentum) 适用场景 1.复杂地形的优化问题 2.数据具有噪声的问…...

2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题
1、面试题模块汇总 面试题包括以下十九个模块: Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示…...

Ubuntu MKL(Intel Math Kernel Library)
Get Intel oneAPI Math Kernel Library wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/79153e0f-74d7-45af-b8c2-258941adf58a/intel-onemkl-2025.0.0.940_offline.sh sudo sh ./intel-onemkl-2025.0.0.940_offline.sh MKL库的配置和使用-CSDN博客 CMak…...

消费电子产品中的噪声对TPS54202的影响
本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 在白色家电领域,降压转换器的应用非常广泛,为了实现不同的功能就需要不同的电源轨。TPS542…...
第四十章:职场转折:突破困境,重新出发
从绍兴与岳父岳母温馨相聚归来后,小冷满心都是温暖与幸福,本以为生活与工作会继续平稳前行,然而,命运却悄然为他的职场之路埋下了转折的伏笔。 平静工作下的暗潮涌动 小冷所在的公司是一家专注于地图导航与位置服务的企业…...
c++ 不定参数,不定类型的 max,min 函数
MSVC\14.29.30133\include\utility(33,19): error C2064: 项不会计算为接受 2 个参数的函数 max min #include <iostream> #include <type_traits>// 自定义 min_gd(支持任意类型和数量参数) template <typename... Args> auto min_g…...

数据库的关系代数
关系就是表 属性(Attribute)是关系中的列.例如,关系 “学生” 中可能有属性 “学号”、“姓名”、“班级”。 元组(Tuple)是关系中的一行数据 1. 基本运算符 选择(Selection) 符号:σ 作用:从关…...
VSCode使用总结
1、VSCode左边资源窗口字体大小设置 方法一(使用,已成功) 进入安装目录Microsoft VS Code\resources\app\out\vs\workbench(如果是下载的压缩包,解压后resources\app\out\vs\workbench) 打开文件 workbench.desktop.main.css 搜…...

关系模型的数据结构及形式化定义
1 关系模型的核心结构 ①单一的数据结构(关系) 现实世界的实体以及实体间的各种联系均用关系来表示 ②逻辑结构(二维表) 从用户角度,关系模型中数据的逻辑结构是一张二维表,行代表元组(记录&a…...

【C++入门讲解】
目录 编辑 --------------------------------------begin---------------------------------------- 一、C简介 二、开发环境搭建 主流开发工具推荐 第一个C程序 三、核心语法精讲 1. 变量与数据类型 2. 运算符大全 3. 流程控制结构 4. 函数深度解析 5. 数组与容…...

数据表中的视图操作
文章目录 一、视图概述二、为什么要使用视图三、创建视图四、查看视图 一、视图概述 小学的时候,每年都会举办一次抽考活动,意思是从每一个班级里面筛选出几个优秀的同学去参加考试,这时候很多班级筛选出来的这些同学就可以临时组成一个班级…...

BFS算法篇——广度优先搜索,探索未知的旅程(上)
文章目录 前言一、BFS的思路二、BFS的C语言实现1. 图的表示2. BFS的实现 三、代码解析四、输出结果五、总结 前言 广度优先搜索(BFS)是一种广泛应用于图论中的算法,常用于寻找最短路径、图的遍历等问题。与深度优先搜索(DFS&…...
mongodb 使用内存过大分析
os 分析 内存使用 ps aux|head -1;ps aux|grep -v PID|sort -rn -k 4|head -10swap 使用 for i in $(ls /proc | grep "^[0-9]" | awk $0>100); do awk /Swap:/{aa$2}END{print "$i",a/1024"M"} /proc/$i/smaps;done| sort -k2nr | headmo…...
CNN-day5-经典神经网络LeNets5
经典神经网络-LeNets5 1998年Yann LeCun等提出的第一个用于手写数字识别问题并产生实际商业(邮政行业)价值的卷积神经网络 参考:论文笔记:Gradient-Based Learning Applied to Document Recognition-CSDN博客 1 网络模型结构 …...
登录到docker里
在Docker中登录到容器通常有两种情况: 登录到正在运行的容器内部:如果你想要进入到正在运行的容器内部,可以使用docker exec命令。 登录到容器中并启动一个shell:如果你想要启动一个容器,并在其中启动一个shell&…...
利用PHP爬虫开发获取淘宝分类详情:解锁电商数据新视角
在电商领域,淘宝作为中国最大的电商平台之一,其分类详情数据对于市场分析、竞争策略制定以及电商运营优化具有极高的价值。通过PHP爬虫技术,我们可以高效地获取这些数据,为电商从业者提供强大的数据支持。本文将详细介绍如何使用P…...