【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…...
JiT源码深度剖析:从Denoiser到Transformer的完整实现
JiT源码深度剖析:从Denoiser到Transformer的完整实现 【免费下载链接】JiT PyTorch implementation of JiT https://arxiv.org/abs/2511.13720 项目地址: https://gitcode.com/gh_mirrors/jit8/JiT JiT(Just image Transformer)是一个…...
【华南理工大学支持 | IEEE出版 | 往届会议论文完成EIScopus双检索 | 云计算、通信工程、图像处理等相关主题均可投稿】第三届云计算与通信工程国际学术会议(CCCE 2026)
第三届云计算与通信工程国际学术会议(CCCE 2026) 2026 3rd International Conference on Cloud Computing and Communication Engineering 2026年06月12-14日 , 中国深圳 征稿主题广:云计算|通信工程|图像处理等相关主题 权威收录:EI…...
如何高效评估ChatGLM3对话系统:全面测试用户体验与任务成功率的实用指南
如何高效评估ChatGLM3对话系统:全面测试用户体验与任务成功率的实用指南 【免费下载链接】ChatGLM3 ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 项目地址: https://gitcode.com/gh_mirrors/ch/ChatGLM3 ChatGLM3作为开源双语对话语言…...
AI应用治理平台ZLAR:从网关到统一架构的演进与实践
1. 项目概述:从单一工具到统一平台的演进最近在折腾AI应用开发,特别是涉及到多模型调用、安全审计和策略执行这块,发现很多开源项目都是“各自为政”。比如,你需要一个网关来管理AI模型的访问,又需要一个独立的日志系统…...
网络虚拟化如何应对100G性能挑战:从SDN/NFV到DPDK与智能网卡的演进
1. 网络虚拟化与100G浪潮:一场正在发生的架构革命如果你在2015年前后从事网络或云计算相关的工作,大概会对一个词印象深刻:100G。当时,行业媒体和厂商都在热烈讨论一个预测——到2018年,100G将成为网络设备,…...
OpalServe:构建团队AI工具统一控制平面,实现MCP服务器集中治理
1. 项目概述:为团队AI工具构建统一控制平面如果你和你的团队正在使用Claude Desktop、Cursor、Windsurf这类支持MCP(Model Context Protocol)的AI编程工具,那么下面这个场景你一定不陌生:每个开发者都需要在自己的机器…...
如何高效为离线音乐库批量下载同步歌词:LRCGET工具全解析
如何高效为离线音乐库批量下载同步歌词:LRCGET工具全解析 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否拥有大量本地音乐文件却苦于…...
Claude 3 Haiku性能白皮书首发(含AWS Inferentia2 vs NVIDIA T4实测对比数据)
更多请点击: https://intelliparadigm.com 第一章:Claude 3 Haiku性能白皮书首发概览 Anthropic 正式发布 Claude 3 系列中最轻量、响应最快的基础模型——Claude 3 Haiku,并同步公开首份面向开发者与企业用户的《Claude 3 Haiku 性能白皮书…...
PyQt6 GUI开发实战:构建现代化桌面应用的架构设计指南
PyQt6 GUI开发实战:构建现代化桌面应用的架构设计指南 【免费下载链接】PyQt-Chinese-tutorial PyQt6中文教程 项目地址: https://gitcode.com/gh_mirrors/py/PyQt-Chinese-tutorial 在当今软件开发领域,桌面应用依然占据着重要地位,特…...
Next.js企业级开发样板Next-Enterprise:一站式集成最佳实践与工具链
1. 项目概述:为什么说 Next-Enterprise 是 Next.js 企业级开发的“瑞士军刀”? 如果你正在用 Next.js 构建一个中大型、对代码质量和开发体验有要求的企业级应用,那你大概率遇到过这些头疼事:项目初始化配置繁琐,得花…...
