C 标准库 - <math.h>和<setjmp.h>详解

目录

简介

库宏

库函数

实例

简介

库变量

库函数

实例


<math.h>

简介

<math.h> 是 C 标准库中的一个头文件,主要提供了数学运算相关的函数和宏定义。它允许您在 C 程序中执行各种常见的数学计算,如三角函数、对数、指数、幂运算等。

库宏

下面是这个库中定义的唯一的一个宏:

HUGE_VAL 是 <math.h> 头文件中定义的一个宏,用于表示一个特定的很大的值。当数学函数的结果无法表示为浮点数时,可以使用 HUGE_VAL 来表示超出范围的结果。

具体来说,如果函数的结果幅度太大以至于无法表示,则函数会将 errno 设置为 ERANGE,表示范围错误,并返回 HUGE_VAL 或 -HUGE_VAL。这允许您判断函数是否返回了一个超出可表示范围的值。

另一方面,如果函数的结果幅度太小,则可能会返回零值。在这种情况下,errno 可能被设置为 ERANGE,也可能不被设置为 ERANGE。因此,在使用数学函数并处理其返回值时,需要注意检查 errno 的值是否指示了错误。

总之,HUGE_VAL 宏对于处理超出可表示范围的数值是非常有用的,可以帮助进行错误处理和边界检查。

库函数

下面列出了头文件 math.h 中定义的函数:

  1. double acos(double x):返回以弧度表示的 x 的反余弦。
  2. double asin(double x):返回以弧度表示的 x 的反正弦。
  3. double atan(double x):返回以弧度表示的 x 的反正切。
  4. double atan2(double y, double x):返回以弧度表示的 y/x 的反正切。y 和 x 的值的符号决定了正确的象限。
  5. double cos(double x):返回弧度角 x 的余弦。
  6. double cosh(double x):返回 x 的双曲余弦。
  7. double sin(double x):返回弧度角 x 的正弦。
  8. double sinh(double x):返回 x 的双曲正弦。
  9. double tanh(double x):返回 x 的双曲正切。
  10. double exp(double x):返回 e 的 x 次幂的值。
  11. double frexp(double x, int *exponent):把浮点数 x 分解成尾数和指数。返回值是尾数,并将指数存入 exponent 中。所得的值是 x = mantissa * 2 ^ exponent。
  12. double ldexp(double x, int exponent):返回 x 乘以 2 的 exponent 次幂。
  13. double log(double x):返回 x 的自然对数(基数为 e 的对数)。
  14. double log10(double x):返回 x 的常用对数(基数为 10 的对数)。
  15. double modf(double x, double *integer):返回值为小数部分(小数点后的部分),并设置 integer 为整数部分。
  16. double pow(double x, double y):返回 x 的 y 次幂。
  17. double sqrt(double x):返回 x 的平方根。
  18. double ceil(double x):返回大于或等于 x 的最小的整数值。
  19. double fabs(double x):返回 x 的绝对值。
  20. double floor(double x):返回小于或等于 x 的最大的整数值。
  21. double fmod(double x, double y):返回 x 除以 y 的余数。

实例

以下是一个简单的代码示例,展示了如何使用 <math.h> 头文件中的一些函数来进行数学计算:

#include <stdio.h>
#include <math.h>  // 引入 math.h 头文件int main() {double x = 1.5;double y = 2.7;// 计算 x 的双曲正弦值和反正切值double sinh_x = sinh(x);double atan_x = atan(x);// 计算 x 的立方根和以 2 为底的对数double cbrt_x = cbrt(x);double log2_x = log2(x);// 计算 y 的向下取整值和 x 与 y 的余数double floor_y = floor(y);double fmod_xy = fmod(x, y);// 打印计算结果printf("sinh(%.2f) = %.2f\n", x, sinh_x);printf("atan(%.2f) = %.2f\n", x, atan_x);printf("cbrt(%.2f) = %.2f\n", x, cbrt_x);printf("log2(%.2f) = %.2f\n", x, log2_x);printf("floor(%.2f) = %.2f\n", y, floor_y);printf("%.2f %% %.2f = %.2f\n", x, y, fmod_xy);return 0;
}

需要注意的是,这些函数在使用的时候需要特别小心,因为它们有可能会产生一些异常情况(例如超出计算机数值范围等)。

让我们编译和运行上面的程序,这将产生下列结果:

sinh(1.50) = 2.13
atan(1.50) = 0.98
cbrt(1.50) = 1.14
log2(1.50) = 0.58
floor(2.70) = 2.00
1.50 % 2.70 = 1.50

<setjmp.h>

简介

<setjmp.h> 是 C 标准库中的一个头文件,提供了一种非局部跳转的机制,允许程序在一个函数中设置一个跳转点,并在另一个函数中跳转到该点。

库变量

<setjmp.h> 头文件并没有定义任何变量。只定义了 jmp_buf 类型作为 setjmp 和 longjmp 函数的参数类型。jmp_buf 是一个用于存储跳转点信息的数组类型,具体的实现细节是未定义的,通常被编译器实现为一个足够大的数组。

请注意,虽然 <setjmp.h> 中没有定义变量,但您可以在程序中创建自己的 jmp_buf 变量,并将其传递给 setjmp 和 longjmp 函数来实现非局部跳转的功能。

库函数

<setjmp.h> 头文件中定义了两个函数:setjmp 和 longjmp,用于实现非局部跳转和异常处理机制。

1、int setjmp(jmp_buf env) 函数

  • 该函数将调用它的地方的当前执行状态保存在 env 中,并返回 0。如果 setjmp 是由 longjmp 跳转回来的,则返回一个非零值。

2、void longjmp(jmp_buf env, int val) 函数

  • 该函数根据传递的 env 参数,恢复相应的执行状态,并跳转到相应的位置。val 参数是返回到 setjmp 的返回值。

这两个函数一起提供了非常有用的异常处理机制,通常用于处理错误或异常情况,以及在程序中实现类似于异常处理的功能。

使用 <setjmp.h> 头文件时,需要注意以下几点:

  • setjmp 和 longjmp 必须在同一个函数调用链中使用,而且 setjmp 必须在 longjmp 之前调用。
  • jmp_buf 类型是一个数组类型,它存储了用于保存执行状态的信息。然而,具体的实现细节是未定义的,因此不能直接访问 jmp_buf 的成员。
  • 使用 setjmp 和 longjmp 时应谨慎,因为它们会导致程序的控制流程变得复杂,并且可能使代码更难理解和维护。

需要注意的是,<setjmp.h> 头文件提供了一种非常底层的编程机制,一般情况下并不推荐频繁使用。

实例

#include <stdio.h>
#include <setjmp.h>jmp_buf exception_env; // 用于保存执行状态的全局变量void handle_exception() {printf("捕获到异常,进行异常处理\n");
}void do_something_dangerous(int input) {if (input < 0) {longjmp(exception_env, 1); // 跳转到异常处理代码} else {printf("正常处理输入:%d\n", input);}
}int main() {if (setjmp(exception_env) == 0) { // 设置异常跳转点// 正常情况do_something_dangerous(10);do_something_dangerous(-5); // 这里会触发异常do_something_dangerous(20); // 这里不会执行} else {// 异常处理handle_exception();}return 0;
}

让我们编译并运行上面的程序,这将产生以下结果:

正常处理输入:10
捕获到异常,进行异常处理

这个示例中定义了一个全局的 jmp_buf 类型的变量 exception_env,用于保存执行状态。在 main 函数中,通过 setjmp 设置了一个异常跳转点,并在 do_something_dangerous 函数中对输入进行判断,如果输入小于 0,则调用 longjmp 跳转到异常处理代码。在跳转回来后,程序可以进行相应的异常处理。

需要注意的是,setjmp 和 longjmp 是比较底层的机制,使用时需要特别小心,因为它们会使程序的控制流程变得复杂,也容易引入难以调试的错误。

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

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

相关文章

两个跨域页面通信(iframe) (postMessage)

两个跨域页面通信&#xff08;iframe&#xff09; (postMessage) 在浏览器的安全模型中&#xff0c;JavaScript通常只能访问与当前网页具有相同源&#xff08;协议、域名、端口&#xff09;的 localStorage 数据&#xff0c; 这意味着&#xff0c;如果你的网页想要访问其他网站…

设计模式 之单例模式

单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供全局访问点&#xff0c;使得该实例可以在程序的任何地方被访问。单例模式经常用于管理共享资源或限制对象创建数量的情况下。 实现一个单例模式需要注意以下几个关键点&#xff1a; 构造…

呼叫中心自建好还是云外呼好用?

传统的呼叫中心在科技的发展下已经被不适用了&#xff0c;都开始使用起智能化的呼叫中心&#xff0c;一个是自建式呼叫中心&#xff0c;一个是云外呼系统。那自建式呼叫中心与云外呼系统的区别有哪些呢&#xff1f; 1、企业自建呼叫中心 劣势 系统维护更新难&#xff1a;自建…

C语言第二十弹--求最大公因数

求最大公因数 最大公因数&#xff1a;也称最大公约数、最大公因子&#xff0c;指两个或多个整数共有约数中最大的一个。 一、穷举法 思路&#xff1a;找到两个数之间的最少值 使用第三接收最小值&#xff0c;然后通过判断两者%n是否同时等于0&#xff0c;同时为0证明就是两者…

安装vue vue-server-renderer报错

安装vue和vue-server-renderer时报错可能有多种原因&#xff0c;以下是一些可能的解决方法&#xff1a; 确认安装了正确的版本&#xff1a;检查您需要安装的Vue版本和Vue-Server-Renderer版本是否匹配&#xff0c;可以在官方文档中查看。 检查网络连接&#xff1a;请确保您的网…

Proxifier联动BurpSuite抓取小程序

直接上软件包 Proxifier安装包https://pan.quark.cn/s/7fb9ad6deb7cProxifier配置文件https://pan.quark.cn/s/049c5f21c97e 无话可说直接操作 1、安装Proxifier步骤可以省略..... 2、将下面文件导入到Proxifier中 3、左上角文件-导入配置文件&#xff08;因为我已经导入过…

java金额大小写转换/金额转大写/数字金额转换为中文大写金额

文章目录 处理金额问题时&#xff0c;经常需要将数字金额转换为中文大写金额&#xff0c;以下为代码及测试用例。 代码 package com.common.utils.money;import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomUtils; import org.apache…

将bitmap转化为1位黑白像素图像(仅保留黑色,其它颜色会删除)

/// <summary> /// 将bitmap转化为1位黑白像素图像(仅保留黑色&#xff0c;其它颜色会删除) /// </summary> /// <param name"bmp"></param> /// <returns></returns> public static Bitmap To1Bit(Bitmap bmp) {Bitmap tmp bm…

C 语言 typedef 关键字

C 语言 typedef 关键字 C 语言提供了 typedef 关键字&#xff0c;您可以使用它来为类型取一个新的有意义的名字。也就是用于重新定义已经存在的变量的名称。 typedef 的语法 typedef <existing_name> <alias_name>在以上语法中&#xff0c;“ **existing_name”…

url最大长度

https://blog.csdn.net/weixin_38673922/article/details/130932457 对于前端作为分享页&#xff0c;或者跳转新页面时&#xff0c;或者做hrbrid 通信&#xff0c;需要用到一系列的参数来处理相对的业务逻辑&#xff0c;那么具体url可以携带多少参数合适&#xff0c;从网上搜索…

【CodeTop】TOP 100 刷题 11-20

文章目录 11. 二叉树的层序遍历题目描述代码与解题思路 12. 搜索旋转排序数组题目描述代码与解题思路 13. 买卖股票的最佳时机题目描述代码和解题思路 14. 岛屿数量题目描述代码与解题思路 15. 环形链表题目描述代码与解题思路 16. 有效的括号题目描述代码与解题思路 17. 合并两…

使用 millis() 函数作为延迟的替代方法(电位器控制延迟时间)

接线图&#xff1a; 代码&#xff1a; unsigned long currentMillis 0; unsigned long previousMillis_LED1 0; unsigned long LED1_delay0; unsigned long previousMillis_LED2 0; unsigned long LED2_delay0; #define LED1 3 #define LED2 9 #define P1 A2 …

动态规划求数组中相邻两数的最小差值( 即相差的绝对值 ) java 实现

算法的核心是&#xff1a;计算当前数和前一个数的差值,用该差值和以前最小的连续数的差值作比较&#xff1b;如果当前的差值更小&#xff0c;则发现了更小的连续数的差值&#xff1b;如果当前的差值更大&#xff0c;则沿用以前的最小连续数差值作为新的最小连续数差值。 MinDif…

python写文件

output_file open(E:/XD_transfer/代码/CNN_new/try.csv, w) output_file.write(Sample, \n) for j in range(5):output_file.write(str(j) \n)

2023亚太杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

HttpClient发送MultipartFile多文件及多参数请求

1、环境准备&#xff1a; <dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency><dependency><groupId>org.apache.httpcomponent…

关于 win11 系统下12代/13代英特尔大小核架构 CPU 的 VMware 优化:输入延迟、卡顿,大小核调度

关于 win11 系统下12代/13代英特尔大小核架构 CPU 的 VMware 优化&#xff1a;输入延迟、卡顿&#xff0c;大小核调度 一、前言二、VMware 的优化2.1 键鼠输入延迟问题的解决2.1.1 搜索内核隔离2.1.2 关闭内存完整性并重启2.1.3 搜索启用或关闭windows功能2.1.4 关闭 hyper-v 和…

Java中有接口了为什么还需要有抽象类,抽象类和普通类和接口,三者之间有什么区别和联系

在 Java 中&#xff0c;接口、抽象类和普通类都是不同的概念&#xff0c;各自有其特定的用途和特性。了解它们之间的区别和联系有助于更好地利用 Java 的面向对象编程特性。 接口&#xff08;Interface&#xff09; 定义: 接口是一种完全抽象的类&#xff0c;它允许声明方法但…

【23真题】难!下沙“小清华”难度爆增!

今天分享的是23年“下沙小清华”杭州电子科技大学843的信号与系统试题及解析。 本套试卷难度分析&#xff1a;22年杭电843考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;平均分为112分&#xff0c;最高分为145分&#xff01;该院校23…

Impala VS Hive

Impala和Hive的关系 Impala是基于Hive的大数据实时分析查询引擎&#xff0c;直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中。并且impala兼容Hive的sql解析&#xff0c;实现了Hive的SQL语义的子集&#xff0c;功能还在不断的完善中。 与Hive的…