当前位置: 首页 > article >正文

【C语言标准库函数】双曲函数:sinh(), cosh(), tanh()

目录

一、头文件

二、函数简介

2.1. 双曲正弦函数 sinh(double x)

2.2. 双曲余弦函数 cosh(double x)

2.3. 双曲正切函数 tanh(double x)

三、函数实现(概念性)

四、注意事项

4.1. 参数类型

4.2. 计算精度

4.3. 函数返回值

4.4. 环境差异

4.5. 物理与几何应用

4.6. 编程实践

五、示例代码


在 C 语言标准库中,<math.h> 头文件提供了用于计算双曲函数的相关函数,常见的有 sinh()cosh() 和 tanh(),本文将详细介绍这几个函数。

一、头文件

这些双曲函数都定义在<math.h>头文件中。要使用它们,需要在C程序中包含这个头文件。

二、函数简介

2.1. 双曲正弦函数 sinh(double x)

双曲正弦函数是数学中的一种重要函数,通常记作 sinh(x),其定义式为:

其中,e 是自然对数的底数,约等于 2.71828。该函数属于双曲函数的一种,与三角函数相似,但具有不同的性质和用途。双曲正弦函数在数学、物理和工程计算中都有广泛的应用。

主要特点:

  • 定义域:双曲正弦函数的定义域为全体实数集,即 x∈R。
  • 值域:其值域也为全体实数集,即 sinh(x)∈R。
  • 奇偶性:双曲正弦函数是奇函数,即满足 sinh(−x)=−sinh(x)。
  • 单调性:在区间 (−∞,+∞) 上,双曲正弦函数是单调增加的。
  • 凹凸性:双曲正弦函数在 x>0 时是凸函数,在 x<0 时是凹函数。
  • 导数:双曲正弦函数的导数是双曲余弦函数,即 dxd​sinh(x)=cosh(x)。

2.2. 双曲余弦函数 cosh(double x)

双曲余弦函数是另一种重要的双曲函数,记作 cosh(x),其定义式为:

主要特点:

  • 定义域:与双曲正弦函数相同,双曲余弦函数的定义域也是全体实数集。
  • 值域:其值域为 [1,+∞),因为对于任何实数 x,ex 和 e−x 都是正的,所以它们的和除以 2 总是大于或等于 1。
  • 奇偶性:双曲余弦函数是偶函数,即满足 cosh(−x)=cosh(x)。
  • 单调性:在区间 [0,+∞) 上,双曲余弦函数是单调增加的(尽管在 (−∞,0) 上也是单调的,但由于偶函数性质,其增减性与 [0,+∞) 上相同)。
  • 凹凸性:双曲余弦函数在其整个定义域上都是凸函数。
  • 导数:双曲余弦函数的导数是双曲正弦函数,即 dxd​cosh(x)=sinh(x)。

2.3. 双曲正切函数 tanh(double x)

双曲正切函数是双曲正弦函数和双曲余弦函数的商,记作 tanh(x),其定义式为:

主要特点:

  • 定义域:与双曲正弦和余弦函数相同,双曲正切函数的定义域也是全体实数集。
  • 值域:其值域为 (−1,1),因为分子是两个指数函数的差,分母是两个指数函数的和,且分母总是大于分子(绝对值上),所以比值永远在 -1 和 1 之间。
  • 奇偶性:双曲正切函数是奇函数,即满足 tanh(−x)=−tanh(x)。
  • 单调性:在区间 (−∞,+∞) 上,双曲正切函数是单调增加的。
  • 凹凸性:双曲正切函数在其整个定义域上都是凹函数。
  • 导数:双曲正切函数的导数是 1−tanh2(x),这可以通过求导法则和链式法则得出。

三、函数实现(概念性)

在C语言中,虽然我们不能直接访问sinh()cosh(), 和 tanh()这些函数的源代码(因为它们是标准库的一部分,且实现依赖于具体的编译器和库),但我们可以基于它们的数学定义来实现概念性的、简单的近似版本。这里,我们将使用exp()函数来计算e的指数,然后根据双曲函数的定义来实现它们。

注意:这里的实现主要是为了教学目的,并不是最优或最精确的。在实际应用中,应该直接使用标准库中的函数,因为它们经过了优化以提供高精度和好的性能。

#include <stdio.h>  
#include <math.h>  
  
// 概念性的sinh实现  
double my_sinh(double x) {  
    return (exp(x) - exp(-x)) / 2.0;  
}  
  
// 概念性的cosh实现  
double my_cosh(double x) {  
    return (exp(x) + exp(-x)) / 2.0;  
}  
  
// 概念性的tanh实现,依赖于sinh和cosh  
double my_tanh(double x) {  
    return my_sinh(x) / my_cosh(x);  
}  
  
int main() {  
    double x = 1.0;  
    printf("sinh(%f) = %f\n", x, my_sinh(x));  
    printf("cosh(%f) = %f\n", x, my_cosh(x));  
    printf("tanh(%f) = %f\n", x, my_tanh(x));  
  
    return 0;  
}

展示了如何基于exp()函数(在<math.h>中定义)来实现sinh()cosh(), 和 tanh()函数的概念性版本。在实际中,由于exp()函数已经足够精确,这种实现方式对于大多数应用场景来说已经足够好了。

然而,值得注意的是,当x的值非常大时,exp(x)exp(-x)的计算可能会导致数值溢出或下溢。为了避免这种问题,库的实现可能会采用更复杂的算法,如泰勒级数、范围约简(range reduction)等技术。

此外,由于浮点数计算的固有性质,即使是使用最精确的方法,对于某些极端值或特殊情况,计算结果也可能会有微小的误差。因此,在实际应用中,应该始终考虑浮点数的精度和误差问题。

四、注意事项

4.1. 参数类型

  • 在大多数编程语言中,这些函数接受的参数应为数值类型(如整数、浮点数等)。如果传入非数值类型(如字符串、日期等),则可能会引发错误或返回异常值。
  • 在C标准库中,所有的三角函数(如sin()cos()tan())和反三角函数(如asin()acos()atan())都期望其参数是以弧度为单位的,而不是度数。如果有一个以度数为单位的角,需要先将其转换为弧度,然后再传递给这些函数。弧度和度数之间的转换关系很简单:
    • 弧度=度数×180π​
    • 度数=弧度×π180​

4.2. 计算精度

  • 由于浮点数计算的固有性质,对于非常大的x值,sinh和cosh函数可能会导致数值溢出。因此,在使用时需要注意x的取值范围,以避免不必要的精度损失或错误。
  • tanh函数由于其值域限制在(-1, 1)之间,因此在处理大数时相对更稳定,但仍然需要注意数值精度的问题。

4.3. 函数返回值

  • sinh和cosh函数的返回值可以是任意实数,因此需要考虑返回值的大小和精度。
  • tanh函数的返回值在(-1, 1)之间,这有助于在某些应用中避免数值的极端波动。

4.4. 环境差异

  • 在不同的编程语言或数学库中,这些函数的实现可能略有差异。因此,在使用时需要参考具体环境或库的文档说明。
  • 特别是在使用Oracle等数据库系统时,需要注意函数的具体语法和使用方式可能与标准数学库有所不同。

4.5. 物理与几何应用

  • 双曲函数在双曲几何、物理学(如高速运动或强引力场问题)等领域有重要应用。在使用时,需要根据具体的应用场景选择合适的函数和参数。

4.6. 编程实践

  • 在编程时,应确保正确引用和调用这些函数。例如,在Excel中使用SINH函数时,需要先输入等号“=”,然后输入函数名和参数;在Oracle数据库中,则需要注意COSH等函数的语法差异。

在C语言中,可以使用M_PI(定义在<math.h>中,但可能需要包含<math_definitions.h>或定义_USE_MATH_DEFINES宏来确保它可用)来表示π的值。

五、示例代码

#include <stdio.h>  
#include <math.h>  
  
int main() {  
    double x = 1.0; // 示例输入值  
  
    // 计算并打印双曲正弦值  
    double sinh_x = sinh(x);  
    printf("sinh(%.2f) = %.2f\n", x, sinh_x);  
  
    // 计算并打印双曲余弦值  
    double cosh_x = cosh(x);  
    printf("cosh(%.2f) = %.2f\n", x, cosh_x);  
  
    // 计算并打印双曲正切值  
    double tanh_x = tanh(x);  
    printf("tanh(%.2f) = %.2f\n", x, tanh_x);  
  
    // 尝试一个较大的值,观察tanh的行为  
    x = 10.0;  
    tanh_x = tanh(x);  
    printf("tanh(%.2f) = %.2f (approaching 1 as x increases)\n", x, tanh_x);  
  
    // 尝试一个较大的负值,观察tanh的行为  
    x = -10.0;  
    tanh_x = tanh(x);  
    printf("tanh(%.2f) = %.2f (approaching -1 as x decreases)\n", x, tanh_x);  
  
    // 尝试0值,观察结果  
    x = 0.0;  
    sinh_x = sinh(x);  
    cosh_x = cosh(x);  
    tanh_x = tanh(x);  
    printf("sinh(%.2f) = %.2f\n", x, sinh_x);  
    printf("cosh(%.2f) = %.2f\n", x, cosh_x);  
    printf("tanh(%.2f) = %.2f\n", x, tanh_x);  
  
    return 0;  
}

 

运行这段代码,可以看到每个函数调用的结果,以及tanh()函数随着x值变化而趋近于其极限值的行为。


http://www.kler.cn/a/538228.html

相关文章:

  • SpringAI系列 - 使用LangGPT编写高质量的Prompt
  • 十二、Docker Compose 部署 SpringCloudAlibaba 微服务
  • idea整合deepseek实现AI辅助编程
  • 【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化
  • 版本更新|OpenCSG AutoHub v0.2.8
  • 将Deepseek接入pycharm 进行AI编程
  • 解决基于FastAPI Swagger UI的文档打不开的问题
  • mysql 存储过程和自定义函数 详解
  • 2025年软件测试五大趋势:AI、API安全、云测试等前沿实践
  • (免费送源码)计算机毕业设计原创定制:C#+Asp.Net+SQL Server C#(asp.net)大学生创新创业项目管理系统
  • yolo11训练模型与测试
  • CNN-day8-经典神经网络GoogleNet
  • Android T(13) 源码分析 — BufferQueue 的分析
  • 【无标题】堆
  • F - Building Roads S
  • 实验5 配置OSPFv2验证
  • Kafka中的KRaft算法
  • 探秘 C++ list:在复杂数据管理的编程世界里,它宛如灵动的魔法链条,高效实现元素频繁增删,有序维系数据秩序,无论是海量动态数据缓存、游戏角色属性集处理,还是复杂任务调度编排
  • 网络通信小白知识扫盲(五)
  • deepseek本地部署-linux
  • 设计模式实战运用之模板方法模式
  • 算法兵法全略
  • 链表专题-01
  • Delphi语言的云计算
  • 【免费】2011-2020年各省长途光缆线路长度数据
  • Linux 调用可执行程序