C 标准库 - <errno.h>和<float.h>详解
目录
简介
常见库宏
简介
常见库宏
<errno.h>
简介
<errno.h>头文件定义了一个名为errno的全局变量,用于表示最近发生的错误代码。errno是一个整数变量,它的值通常是一个非零的错误代码,用于指示发生了什么类型的错误。也可以在适当的时候修改它的值或重置为零。
<errno.h>头文件还定义了一些常量,这些常量代表不同类型的错误代码。这些常量可以在程序中与errno的值进行比较,以确定发生了哪种类型的错误。
以下是一些常见的errno常量:
- EDOM:表示数学域错误,例如对负数求平方根。
- ERANGE:表示结果超出范围,例如对一个超出整型范围的数进行计算。
- EACCES:表示权限被拒绝,例如试图以只读方式打开一个只有写权限的文件。
- ENOENT:表示文件或目录不存在。
- EINVAL:表示无效的参数,例如传递给函数的参数值不符合预期。
常见库宏
1、extern int errno:
这是一个全局变量,类型为int,用于表示最近发生的错误代码。它通过系统调用设置,在某些库函数中指示发生了什么类型的错误。在程序启动时,errno的初始值通常为0。当发生错误时,特定的库函数会修改errno的值为非零值,以表示不同类型的错误。errno是可更改的左值,因此可以通过程序来读取和修改它的值。
2、EDOM:
这个宏表示数学域错误。当某个数学函数的输入参数超出了该函数定义的域时,就会发生域错误。例如,对负数求平方根或对负数进行对数运算都会导致域错误。当发生域错误时,errno会被设置为EDOM。
3、ERANGE:
这个宏表示范围错误。当某个数学函数的输入参数超出了该函数定义的范围时,就会发生范围错误。例如,对一个超出整型范围的数进行计算可能导致范围错误。当发生范围错误时,errno会被设置为ERANGE。
这些宏提供了一种标准化的方式来表示不同类型的错误,并且可以帮助程序员在错误处理过程中进行识别和处理。通过检查errno的值,可以确定特定函数调用是否发生了错误,并根据需要采取适当的措施。
实例
以下是一个简单的代码示例,演示了如何使用<errno.h>头文件中定义的宏来检测和处理错误:
#include <stdio.h>
#include <errno.h>
#include <math.h>int main() {double x = -1.0;double result = sqrt(x);if (errno == EDOM) {printf("sqrt(%f) 发生域错误\n", x);} else if (errno == ERANGE) {printf("sqrt(%f) 发生范围错误\n", x);} else {printf("sqrt(%f) = %f\n", x, result);}return 0;
}
在这个示例中,我们尝试对负数进行平方根运算。由于平方根函数只能对非负数进行计算,因此会发生域错误。我们使用if语句检查errno的值,并根据不同的错误类型打印出相应的错误消息。如果没有发生错误,则打印出计算结果。
请注意,我们使用了sqrt()函数来计算平方根,并且没有显式地检查其返回值。这是因为sqrt()函数在发生域错误时会返回一个特殊的值NaN(Not a Number),而不是设置errno的值。因此,我们必须使用errno来检测域错误。
输出结果:
sqrt(-1.000000) 发生域错误
<float.h>
简介
C 标准库的 float.h 头文件包含了一组与浮点值相关的依赖于平台的常量。浮点数是一种用于表示实数的数值类型,它由符号位、基数、指数和精度组成。C 标准库的 <float.h> 头文件定义了与浮点数相关的一些常量,这些常量的值依赖于所运行的平台。
组件 | 组件描述 |
---|---|
S | 符号 ( +/- ) |
b | 指数表示的基数,2 表示二进制,10 表示十进制,16 表示十六进制,等等... |
e | 指数,一个介于最小值 emin 和最大值 emax 之间的整数。 |
p | 精度,基数 b 的有效位数 |
常见库宏
下面的值是特定实现的,且是通过 #define 指令来定义的,这些值都不得低于下边所给出的值。请注意,所有的 FLT 是指类型 float 的浮点数,DBL 是指类型 double 的浮点数,LDBL 是指类型 long double 的浮点数。
宏 | 描述 |
---|---|
FLT_ROUNDS | 定义浮点加法的舍入模式,它可以是下列任何一个值:
|
FLT_RADIX 2 | 这个宏定义了指数表示的基数。基数 2 表示二进制,基数 10 表示十进制,基数 16 表示十六进制。 |
FLT_MANT_DIG DBL_MANT_DIG LDBL_MANT_DIG | 这些宏定义了 FLT_RADIX 基数中的位数。 |
FLT_DIG 6 DBL_DIG 10 LDBL_DIG 10 | 这些宏定义了舍入后不会改变表示的十进制数字的最大值(基数 10)。 |
FLT_MIN_EXP DBL_MIN_EXP LDBL_MIN_EXP | 这些宏定义了基数为 FLT_RADIX 时的指数的最小负整数值。 |
FLT_MIN_10_EXP -37 DBL_MIN_10_EXP -37 LDBL_MIN_10_EXP -37 | 这些宏定义了基数为 10 时的指数的最小负整数值。 |
FLT_MAX_EXP DBL_MAX_EXP LDBL_MAX_EXP | 这些宏定义了基数为 FLT_RADIX 时的指数的最大整数值。 |
FLT_MAX_10_EXP +37 DBL_MAX_10_EXP +37 LDBL_MAX_10_EXP +37 | 这些宏定义了基数为 10 时的指数的最大整数值。 |
FLT_MAX 1E+37 DBL_MAX 1E+37 LDBL_MAX 1E+37 | 这些宏定义最大的有限浮点值。 |
FLT_EPSILON 1E-5 DBL_EPSILON 1E-9 LDBL_EPSILON 1E-9 | 这些宏定义了可表示的最小有效数字。 |
FLT_MIN 1E-37 DBL_MIN 1E-37 LDBL_MIN 1E-37 | 这些宏定义了最小的浮点值。 |
这些常量的值可以在程序中使用,以便在不同的平台上保持浮点数操作的一致性和可移植性。通过使用这些常量,您可以编写与浮点数相关的代码,而不需要关心底层平台的具体细节。
实例
以下是一个使用 <float.h> 头文件中常量的示例代码,它检测浮点数的溢出和下溢情况,并将结果输出到标准输出流:
#include <stdio.h>
#include <float.h>int main() {float f = FLT_MAX;double d = DBL_MAX;long double ld = LDBL_MAX;// 检查浮点数是否溢出或下溢if (f > FLT_MAX) {printf("float 类型的变量 f 溢出\n");} else if (f < FLT_MIN) {printf("float 类型的变量 f 下溢\n");} else {printf("float 类型的变量 f 未溢出也未下溢\n");}if (d > DBL_MAX) {printf("double 类型的变量 d 溢出\n");} else if (d < DBL_MIN) {printf("double 类型的变量 d 下溢\n");} else {printf("double 类型的变量 d 未溢出也未下溢\n");}if (ld > LDBL_MAX) {printf("long double 类型的变量 ld 溢出\n");} else if (ld < LDBL_MIN) {printf("long double 类型的变量 ld 下溢\n");} else {printf("long double 类型的变量 ld 未溢出也未下溢\n");}return 0;
}
该程序首先包含了 <stdio.h> 和 <float.h> 头文件。然后,它定义了一个 float 类型的变量 f,一个 double 类型的变量 d 和一个 long double 类型的变量 ld,并将它们分别初始化为它们所能表示的最大值。
接下来,程序使用 <float.h> 头文件中的常量 FLT_MAX、FLT_MIN、DBL_MAX、DBL_MIN、LDBL_MAX 和 LDBL_MIN 来检测浮点数是否溢出或下溢。如果某个变量的值超过了它所能表示的最大值,则认为它溢出;如果它的值小于它所能表示的最小值,则认为它下溢。
最后,程序使用 printf() 函数将结果输出到标准输出流。输出语句使用了格式化字符串,其中 %s 表示一个字符串,而 %f 表示一个浮点数。
让我们编译和运行上面的程序,这将产生下列结果:
float 类型的变量 f 未溢出也未下溢
double 类型的变量 d 未溢出也未下溢
long double 类型的变量 ld 未溢出也未下溢
这个示例程序演示了如何使用 <float.h> 头文件中的常量来检测浮点数的溢出和下溢情况,并将结果输出到标准输出流。
相关文章:
C 标准库 - <errno.h>和<float.h>详解
目录 简介 常见库宏 简介 常见库宏 <errno.h> 简介 <errno.h>头文件定义了一个名为errno的全局变量,用于表示最近发生的错误代码。errno是一个整数变量,它的值通常是一个非零的错误代码,用于指示发生了什么类型的错误。也可以…...
对于如何学习的一点思考
目录 1、学习遇到的问题 2、问题分析 3、解决思路 1、学习遇到的问题 我们经常在学习一个知识时,经常会遇到知识点凌乱、读书效率低、缺乏长期记忆等问题,主要体现在: 知识点凌乱:花时间学习了很多技术点,但是由于…...
Ensemble Methods集成学习大比拼:性能、应用场景和可视化对比总结
集成学习(Ensemble Learning)是一种机器学习范式,其中多个模型(通常称为“弱学习器”)被训练以解决相同的问题,并且通过某种方式结合它们的预测以提高整体性能。这种方法的核心思想是,多个模型比单一模型更能准确地预测未知数据。在本文中,我们将探讨多种集成学习算法,…...

【2024秋招】2023-9-16 贝壳后端开发二面
1 自我介绍 2 秒杀系统 2.1 超卖怎么解决 3 redis 3.1 过期策略 3.2 过期算法 4 kafka 4.1 说一说你对kafka的了解 4.2 如何保证事务性消息 4.3 如何保证消息不丢失 4.4 消息队列的两种通信方式 点对点模式 如上图所示,点对点模式通常是基于拉取或者轮询…...

SpringCloud 微服务全栈体系(七)
第九章 Docker 一、什么是 Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致…...

SAP ABAP 报表输出成 excel 统计图形 (RFC : GFW_PRES_SHOW_MULT)
SAP 预设了一个类型组 GFW ,做简单的excel图形输出 话不多说,直接上代码: *&---------------------------------------------------------------------* *& Report ZCYCLE057 *&----------------------------------------------…...
微信小程序如何获取地理位置
在微信小程序中,可以通过以下步骤获取用户的地理位置: 在小程序的app.json文件中配置权限: json "permission": {"scope.userLocation": {"desc": "你的位置信息将用于获取附近的服务"} }这样配置后…...

计算机网络相关硬件介绍
计算机相关硬件 计算机由运算器、控制器、存储器、输入设备和输出设备等五个逻辑计算机硬件部件组成。 一、中央处理器(CPU)(运算器、控制器) (1)运算器 运算器是对数据进行加工处理的部件ÿ…...

Megatron-LM GPT 源码分析(三) Pipeline Parallel分析
引言 本文接着上一篇【Megatron-LM GPT 源码分析(二) Sequence Parallel分析】,基于开源代码 GitHub - NVIDIA/Megatron-LM: Ongoing research training transformer models at scale ,通过GPT的模型运行示例,从三个维…...

Python---使用turtle模块+for循环绘制五角星---利用turtle(海龟)模块
首先了解涉及的新词汇,编程外国人发明的,所以大部分是和他们语言相关,了解对应意思,可以更好理解掌握。 import 英 /ˈɪmpɔːt/ n. 进口,进口商品;输入,引进;重要性;…...
Python的比较运算符查询表
据个人的编程开发经验,Python的比较运算符最常于条件判断,而条件判断是python编程中最常用的语法之一,与for或while的循环一样,功能十分强大! 在机器学习当中,或深度学习当中,在运用算法对统计…...

C/C++面试常见问题——const关键字的作用和用法
首先我们需要一下const关键字的定义,const名叫常量限定符,当const修饰变量时,就是在告诉编译器该变量只可访问不可修改,而编译器对于被const修饰的变量有一个优化,编译器不会专门为其开辟空间,而是将变量名…...

Vue3.3指北(四)
Vue3.3指北 1、WebPack - VueCLI1.1、WebPack安装VueCli1.2、vue create 创建项目1.3、项目目录结构介绍 2、ViteVue32.1、认识create-vue2.2、使用create-vue创建项目2.3、项目目录剖析2.4、ESlint代码规范及手动修复2.5、通过eslint插件来实现自动修正 3、VueRouter43.1、单页…...
vue如何使用路由拦截器
在 Vue 中使用路由拦截器需要使用 Vue Router 提供的 beforeEach 方法。beforeEach 方法会在每个路由切换前,对路由进行拦截处理。可以在这个方法中进行一些验证或者权限认证,如果满足条件则继续跳转,否则取消跳转并进行相应处理。 下面是一…...
Docker 深度清除镜像缓存 (overlay2)
Docker 深度清除镜像缓存 (overlay2) 一般情况下,运维清理镜像是通过命令 docker rm i 删除镜像的。但是这条命令不会删除docker build命令产生的缓存文件。 这个时候需要使用 docker system 的系列命令来做相关处理。 docker system --hel…...
刷题笔记(第三天)
1.给定二进制字符串,将其换算成对应的十进制数字 输入:11000000 输出:192 function base10(str) {let sum 0;let a str.split().reverse(); // 个位是第一个元素for (var i 0; i < a.length; i) {suma[i]*Math.pow(2, i);}return sum;…...

Linux常用命令——chown命令
在线Linux命令查询工具 chown 用来变更文件或目录的拥有者或所属群组 补充说明 chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D࿰…...
浅谈Docker原理
文章目录 前言命名空间控制组分层存储镜像和容器Docker EngineDocker Registry 前言 Docker 是一种容器化技术,它通过利用 Linux 内核提供的虚拟化技术和隔离机制,实现了更轻量级的应用程序虚拟化方案 命名空间 Docker 使用了 Linux 的命名空间特性&a…...
Rt-Thread 移植5--空闲线程和线程阻塞(KF32)
5.1原因 线程延时是浪费CPU资源,受否可以考虑延时的时候放弃CPU使用权,这样就充分利用了CPU的资源。 如果线程进入阻塞状态,没有其他线程运行,是否可以运行一个空闲线程来做一些内存的清理等系统工作呢:5.2 实现 5.2…...

Web3 治理实践探讨:如何寻找多元化发展路径?
Web3 领域变革正崭露头角,而社区治理开始成为行业热议话题。Web3 项目如何探寻多元化建设的解困路径,究竟是治理模型的精进成为首要问题,还是吸纳更多资金与组织教育培训,让开发者成为项目建设的中坚力量?本期 TinTinW…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...