【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中定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14654.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

活动预告 |【Part 2】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…

MySQL第五次作业

根据图片内容完成作业 1.建表 &#xff08;1&#xff09;建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…

Breakout靶场小试牛刀

1.首先经典两件套 nmap -A 扫描 发现开放很多端口&#xff08;80&#xff0c;10000&#xff0c;20000为重点关注&#xff09; 问题不大&#xff0c;先dirsearch扫一下目录再说 结果能看的manual里啥也没有&#xff0c;之后再查看80端口界面源代码 发现有一串字符 但是问了ai…

Vue el-tree 加载过滤出的父节点以及其包含的子节点

由于el-tree提供的过滤函数&#xff0c;过滤出来的目录节点不包含子节点&#xff0c;因此需要改造过滤函数&#xff0c;使其过滤出的目录节点包含子节点。 <template><div><el-input placeholder"请输入内容" v-model"filterText" clearab…

认识O(NlogN)的排序

归并排序 归并排序&#xff08;任何一个递归&#xff09;如果不懂可以画一个树状结构去帮助自己去理解。 核心排序方法为Merger public class 归并排序 {public static void main(String[] args) {int[] arr1 {3, 1, 2, 2, 5, 6};int[] arr2 Arrays.copyOf(arr1, arr1.len…

如何使用Gemini模型,国内如何订阅购买Gemini Pro的教程,Gemini Pro 免费试用操作步骤, 谷歌 aistudio 使用入口

最近的榜首又被Gemini给霸占了&#xff0c;很多童鞋想要体验一翻 Gemini免费库模型更新了 Gemini2.0向所有人开放了&#xff01;使用了真香 目前呢2.0flash和Gemini-2.0-Flash-Thinking-Exp、Gemini-2.0-Flash-Thinking-Exp-with-apps已经免费给所有注册用户开放了&#xff0c…

【数据结构】(7) 栈和队列

一、栈 Stack 1、什么是栈 栈是一种特殊的线性表&#xff0c;它只能在固定的一端&#xff08;栈顶&#xff09;进行出栈、压栈操作&#xff0c;具有后进先出的特点。 2、栈概念的例题 答案为 C&#xff0c;以C为例进行讲解&#xff1a; 第一个出栈的是3&#xff0c;那么 1、…

安宝特方案 | AR助力制造业安全巡检智能化革命!

引言&#xff1a; 在制造业中&#xff0c;传统巡检常面临流程繁琐、质量波动、数据难以追溯等问题。安宝特AR工作流程标准化解决方案&#xff0c;通过增强现实AR技术&#xff0c;重塑制造业安全巡检模式&#xff0c;以标准化作业流程为核心&#xff0c;全面提升效率、质量与…

语言月赛 202308【小粉兔做麻辣兔头】题解(AC)

》》》点我查看「视频」详解》》》 [语言月赛 202308] 小粉兔做麻辣兔头 题目描述 粉兔喜欢吃麻辣兔头&#xff0c;麻辣兔头的辣度分为若干级&#xff0c;用数字表示&#xff0c;数字越大&#xff0c;兔头越辣。为了庆祝粉兔专题赛 #1 的顺利举行&#xff0c;粉兔要做一些麻…

Dify Ollama本地私有化模型实践

今天给大家带来一篇deepseek本地部署&#xff0c;笔者最近由于研究AI大模型应用开发&#xff0c;笔记较少&#xff0c;后面将持续输出关于AI行业应用知识&#xff0c;请大家继续关注&#xff0c;话不多说&#xff0c;开始吧&#xff0c;啊哈哈。 DeepSeek 呢&#xff0c;最近十…

Kafka中的KRaft算法

我们之前的Kafka值依赖于Zookeeper注册中心来启动的&#xff0c;往里面注册我们节点信息 Kafka是什么时候不依赖Zookeeper节点了 在Kafka2.8.0开始就可以不依赖Zookeeper了 可以用KRaft模式代替Zookeeper管理Kafka集群 KRaft Controller和KRaft Leader的关系 两者关系 Lea…

GitPuk快速安装配置教程(入门级)

GitPuk是一款国产开源免费的代码管理工具&#xff0c;工具简洁易用&#xff0c;开源免费&#xff0c;本文将讲解如何快速安装和配置GitPuk&#xff0c;以快速入门上手。 1、安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Linux安装&#xfeff; 以下以Centos7安装…

2025年02月08日Github流行趋势

项目名称&#xff1a;anything-llm 项目地址url&#xff1a;https://github.com/Mintplex-Labs/anything-llm项目语言&#xff1a;JavaScript历史star数&#xff1a;34323今日star数&#xff1a;675项目维护者&#xff1a;timothycarambat, shatfield4, MrSimonC, franzbischof…

【C语言标准库函数】指数与对数函数:exp(), log(), log10()

目录 一、头文件 二、函数简介 2.1. exp(double x) 2.2. log(double x) 2.3. log10(double x) 三、函数实现&#xff08;概念性&#xff09; 3.1. exp(double x) 的模拟实现 3.2. log(double x) 和 log10(double x) 的模拟实现 四、注意事项 4.1. exp(double x) 的注…

Linux之kernel(1)系统基础理论(1)

Linux之Kernel(1)系统基础理论(1) Author: Once Day Date: 2025年2月6日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux内核知识_Once-Day的…

从 Facebook 到元宇宙:社交网络的技术进化与前景

引言 社交网络的演变不仅仅是技术进步的体现&#xff0c;更是人类沟通方式革命的缩影。从 Facebook 的诞生到元宇宙的兴起&#xff0c;我们见证了社交互动从简单的信息交换到沉浸式虚拟体验的转变。本文将探讨这一技术演进的历程&#xff0c;并展望社交网络在元宇宙时代的新形…

内容中台赋能人工智能技术提升业务创新能力

内容概要 在当今快速变化的市场环境中&#xff0c;企业需要不断寻求创新以保持竞争力。内容中台作为一种新型的内容管理架构&#xff0c;能够极大地提升企业在内容创建、管理和分发方面的效率。通过与人工智能技术的深度融合&#xff0c;企业能够将海量的数据和信息转化为有价…

qt部分核心机制

作业 1> 手动将登录项目实现&#xff0c;不要使用拖拽编程 并且&#xff0c;当点击登录按钮时&#xff0c;后台会判断账号和密码是否相等&#xff0c;如果相等给出登录成功的提示&#xff0c;并且关闭当前界面&#xff0c;发射一个跳转信号&#xff0c;如果登录失败&#…

深度解析全钢陶瓷防静电地板在机房装修中应用较多的原因

全钢陶瓷防静电地板之所以在机房装修中应用较多&#xff0c;是因为它结合了全钢结构和陶瓷面层的双重优势&#xff0c;能够满足高要求场景&#xff08;如数据中心、实验室、医疗设施等&#xff09;对防静电性能、承重能力、耐用性及环境适应性的综合需求。以下是具体原因分析&a…

数据表中的视图操作

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