【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…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...