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

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定义浮点加法的舍入模式,它可以是下列任何一个值:
  • -1 - 无法确定

  • 0 - 趋向于零

  • 1 - 去最近的值

  • 2 - 趋向于正无穷

  • 3 - 趋向于负无穷

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的全局变量&#xff0c;用于表示最近发生的错误代码。errno是一个整数变量&#xff0c;它的值通常是一个非零的错误代码&#xff0c;用于指示发生了什么类型的错误。也可以…...

对于如何学习的一点思考

目录 1、学习遇到的问题 2、问题分析 3、解决思路 1、学习遇到的问题 我们经常在学习一个知识时&#xff0c;经常会遇到知识点凌乱、读书效率低、缺乏长期记忆等问题&#xff0c;主要体现在&#xff1a; 知识点凌乱&#xff1a;花时间学习了很多技术点&#xff0c;但是由于…...

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 消息队列的两种通信方式 点对点模式 如上图所示&#xff0c;点对点模式通常是基于拉取或者轮询…...

SpringCloud 微服务全栈体系(七)

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

SAP ABAP 报表输出成 excel 统计图形 (RFC : GFW_PRES_SHOW_MULT)

SAP 预设了一个类型组 GFW &#xff0c;做简单的excel图形输出 话不多说&#xff0c;直接上代码&#xff1a; *&---------------------------------------------------------------------* *& Report ZCYCLE057 *&----------------------------------------------…...

微信小程序如何获取地理位置

在微信小程序中&#xff0c;可以通过以下步骤获取用户的地理位置&#xff1a; 在小程序的app.json文件中配置权限&#xff1a; json "permission": {"scope.userLocation": {"desc": "你的位置信息将用于获取附近的服务"} }这样配置后…...

计算机网络相关硬件介绍

计算机相关硬件 计算机由运算器、控制器、存储器、输入设备和输出设备等五个逻辑计算机硬件部件组成。 一、中央处理器&#xff08;CPU&#xff09;&#xff08;运算器、控制器&#xff09; &#xff08;1&#xff09;运算器 运算器是对数据进行加工处理的部件&#xff…...

Megatron-LM GPT 源码分析(三) Pipeline Parallel分析

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

Python---使用turtle模块+for循环绘制五角星---利用turtle(海龟)模块

首先了解涉及的新词汇&#xff0c;编程外国人发明的&#xff0c;所以大部分是和他们语言相关&#xff0c;了解对应意思&#xff0c;可以更好理解掌握。 import 英 /ˈɪmpɔːt/ n. 进口&#xff0c;进口商品&#xff1b;输入&#xff0c;引进&#xff1b;重要性&#xff1b;…...

Python的比较运算符查询表

据个人的编程开发经验&#xff0c;Python的比较运算符最常于条件判断&#xff0c;而条件判断是python编程中最常用的语法之一&#xff0c;与for或while的循环一样&#xff0c;功能十分强大&#xff01; 在机器学习当中&#xff0c;或深度学习当中&#xff0c;在运用算法对统计…...

C/C++面试常见问题——const关键字的作用和用法

首先我们需要一下const关键字的定义&#xff0c;const名叫常量限定符&#xff0c;当const修饰变量时&#xff0c;就是在告诉编译器该变量只可访问不可修改&#xff0c;而编译器对于被const修饰的变量有一个优化&#xff0c;编译器不会专门为其开辟空间&#xff0c;而是将变量名…...

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 方法会在每个路由切换前&#xff0c;对路由进行拦截处理。可以在这个方法中进行一些验证或者权限认证&#xff0c;如果满足条件则继续跳转&#xff0c;否则取消跳转并进行相应处理。 下面是一…...

Docker 深度清除镜像缓存 (overlay2)

Docker 深度清除镜像缓存 &#xff08;overlay2&#xff09; 一般情况下&#xff0c;运维清理镜像是通过命令 docker rm i 删除镜像的。但是这条命令不会删除docker build命令产生的缓存文件。 这个时候需要使用 docker system 的系列命令来做相关处理。 docker system --hel…...

刷题笔记(第三天)

1.给定二进制字符串&#xff0c;将其换算成对应的十进制数字 输入&#xff1a;11000000 输出&#xff1a;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命令改变某个文件或目录的所有者和所属的组&#xff0c;该命令可以向某个用户授权&#xff0c;使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D&#xff0…...

浅谈Docker原理

文章目录 前言命名空间控制组分层存储镜像和容器Docker EngineDocker Registry 前言 Docker 是一种容器化技术&#xff0c;它通过利用 Linux 内核提供的虚拟化技术和隔离机制&#xff0c;实现了更轻量级的应用程序虚拟化方案 命名空间 Docker 使用了 Linux 的命名空间特性&a…...

Rt-Thread 移植5--空闲线程和线程阻塞(KF32)

5.1原因 线程延时是浪费CPU资源&#xff0c;受否可以考虑延时的时候放弃CPU使用权&#xff0c;这样就充分利用了CPU的资源。 如果线程进入阻塞状态&#xff0c;没有其他线程运行&#xff0c;是否可以运行一个空闲线程来做一些内存的清理等系统工作呢&#xff1a;5.2 实现 5.2…...

Web3 治理实践探讨:如何寻找多元化发展路径?

Web3 领域变革正崭露头角&#xff0c;而社区治理开始成为行业热议话题。Web3 项目如何探寻多元化建设的解困路径&#xff0c;究竟是治理模型的精进成为首要问题&#xff0c;还是吸纳更多资金与组织教育培训&#xff0c;让开发者成为项目建设的中坚力量&#xff1f;本期 TinTinW…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...