【C语言标准库函数】三角函数

news2025/2/10 23:17:49

目录

一、头文件

二、函数简介

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.coloradmin.cn/o/2295299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redisson全面解析:从使用方法到工作原理的深度探索

文章目录 写在文章开头详解Redisson基本数据类型基础配置字符串操作列表操作映射集阻塞队列延迟队列更多关于Redisson详解Redisson 中的原子类详解redisson中的发布订阅模型小结参考写在文章开头 Redisson是基于原生redis操作指令上进一步的封装,屏蔽了redis数据结构的实现细…

声明式导航,编程式导航,导航传参,下拉刷新

1.页面导航 1.声明式导航 1.1跳转到tabBar页面 1.2跳转到非tabBar页面 1.2后退导航 、 2.编程式导航 2.1跳转到tabBar页面 2.1跳转到非tabBar页面 2.3后退导航 3.导航传参 3.1声名式导航传参 3.2编程式导航传参 3.3在onLoad中接受参数 4.下拉刷新 4.1回顾下拉刷新…

金和OA C6 DownLoadBgImage任意文件读取漏洞

金和OA C6 DownLoadBgImage任意文件读取漏洞 漏洞描述 金和C6数据库是一款针对企业信息化管理而设计的高级数据库管理系统&#xff0c;主要应用于企业资源规划&#xff08;ERP&#xff09;、客户关系管理&#xff08;CRM&#xff09;以及办公自动化&#xff08;OA&#xff09…

激活函数篇 03 —— ReLU、LeakyReLU、ELU

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归&#xff1a;Sigmoid函数在分类问题中的应用 整流线性单位函数&#xff08;Rectified Linear Unit, ReLU&#xff09;&#xff0c;又称修正线性单元&a…

Kafka 入门与实战

一、Kafka 基础 1.1 创建topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test --create 1.2 查看消费者偏移量位置 kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group test 1.3 消息的生产与发送 #生产者 kafka-cons…

5 计算机网络

5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的&#xff0c;效率低的&#xff1b; 1.HTTP协议端口默认80&#xff0c;HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册&#xff0c;1024以后的则需…

VMware虚拟机安装、创建Ubuntu虚拟机及汉化设置全流程详细教程

一、安装VMware Workstation 下载VMware 访问官网&#xff1a;https://www.vmware.com 选择适合的版本&#xff08;如 Workstation Pro 或 VMware Player&#xff0c;后者免费&#xff09;。完成下载后运行安装程序。 网盘下载&#xff1a; 链接: https://pan.baidu.com/s/1MQ…

21.2.7 综合示例

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 【例 21.7】【项目&#xff1a;code21-007】填充职员表并打印。 本例使用到的Excel文件为&#xff1a;职员信息登记表.xlsx&#x…

【大模型】DeepSeek与chatGPT的区别以及自身的优势

目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…

burpsuite抓取html登陆和上传数据包

一、burpsuite抓取html登陆数据包 1、先写一个html格式的登陆页面 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><title>这是标签</title></head> <body> <hr><!-- 登陆表单 …

Linux 安装 Ollama

1、下载地址 Download Ollama on Linux 2、有网络直接执行 curl -fsSL https://ollama.com/install.sh | sh 命令 3、下载慢的解决方法 1、curl -fsSL https://ollama.com/install.sh -o ollama_install.sh 2、sed -i s|https://ollama.com/download/ollama-linux|https://…

使用Ollama本地部署deepseek

1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包&#xff0c;如同安装软件一样&#xff0c;直接安装即可 win中默认为C盘&#xff0c;如果需要修改到其他盘&#xff0c;查找具体教程 运行list命令&#xff0c;检查是否安装成功 2、修改模型下载的…

如何在RTACAR中配置IP多播(IP Multicast)

一、什么是IP多播 IP多播&#xff08;IP Multicast&#xff09;是一种允许数据包从单一源地址发送到多个目标地址的技术&#xff0c;是一种高效的数据传输方式。 多播地址是专门用于多播通信的IP地址&#xff0c;范围从 224.0.0.0到239.255.255.255 与单播IP地址不同&#x…

2025年最新版武书连SCD期刊(中国科学引文数据库)来源期刊已更新,可下载PDF版!需要的作者进来了解~

2025年最新版武书连SCD期刊&#xff08;中国科学引文数据库&#xff09;来源期刊已更新&#xff01; 官网是不提供免费查询的。小编给大家两个路径&#xff0c;无需下载PDF&#xff0c;随时随地都能查25版SCD目录。 路径一&#xff1a;中州期刊联盟官网&#xff0c;25版SCD目…

存储异常导致的Oracle重大生产故障

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈&#xff0c;追求远距离的视音频的同步交互成为新的时尚。近些年来&#xff0c;依托计算机技术、通信技术和网络条件的发展&#xff0c;集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…

C++ Primer 成员访问运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

使用云效解决docker官方镜像拉取不到的问题

目录 前言原文地址测试jenkins构建结果:后续使用说明 前言 最近经常出现docker镜像进行拉取不了&#xff0c;流水线挂掉的问题&#xff0c;看到一个解决方案: 《借助阿里个人版镜像仓库云效实现全免费同步docker官方镜像到国内》 原文地址 https://developer.aliyun.com/artic…

【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析

一、引言与背景 在人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;如DeepSeek以其卓越的自然语言理解和生成能力&#xff0c;推动了众多应用场景的发展。然而&#xff0c;大型模型的高昂计算和存储成本&#xff0c;以及潜在的数据隐私风险&#xff0c;限制了…

3D图形学与可视化大屏:什么是几何着色器,有什么功能和应用。

一、几何着色器的定义 在 3D 图形学和可视化大屏中&#xff0c;几何着色器是一种可编程的图形处理单元&#xff08;GPU&#xff09;着色器阶段。它位于顶点着色器和片段着色器之间&#xff0c;主要负责处理由顶点着色器输出的几何图形数据。 几何着色器以图元&#xff08;如点…