• C 标准库 - <errno.h>和<float.h>详解


    目录

    简介

    常见库宏

    简介

    常见库宏


    简介

    头文件定义了一个名为errno的全局变量,用于表示最近发生的错误代码。errno是一个整数变量,它的值通常是一个非零的错误代码,用于指示发生了什么类型的错误。也可以在适当的时候修改它的值或重置为零。

    头文件还定义了一些常量,这些常量代表不同类型的错误代码。这些常量可以在程序中与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的值,可以确定特定函数调用是否发生了错误,并根据需要采取适当的措施。

    实例

    以下是一个简单的代码示例,演示了如何使用头文件中定义的宏来检测和处理错误:

    1. #include
    2. #include
    3. #include
    4. int main() {
    5. double x = -1.0;
    6. double result = sqrt(x);
    7. if (errno == EDOM) {
    8. printf("sqrt(%f) 发生域错误\n", x);
    9. } else if (errno == ERANGE) {
    10. printf("sqrt(%f) 发生范围错误\n", x);
    11. } else {
    12. printf("sqrt(%f) = %f\n", x, result);
    13. }
    14. return 0;
    15. }

    在这个示例中,我们尝试对负数进行平方根运算。由于平方根函数只能对非负数进行计算,因此会发生域错误。我们使用if语句检查errno的值,并根据不同的错误类型打印出相应的错误消息。如果没有发生错误,则打印出计算结果。

    请注意,我们使用了sqrt()函数来计算平方根,并且没有显式地检查其返回值。这是因为sqrt()函数在发生域错误时会返回一个特殊的值NaN(Not a Number),而不是设置errno的值。因此,我们必须使用errno来检测域错误。

    输出结果:

    sqrt(-1.000000) 发生域错误

    简介

    C 标准库的 float.h 头文件包含了一组与浮点值相关的依赖于平台的常量。浮点数是一种用于表示实数的数值类型,它由符号位、基数、指数和精度组成。C 标准库的 头文件定义了与浮点数相关的一些常量,这些常量的值依赖于所运行的平台。

    组件组件描述
    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

    这些宏定义了最小的浮点值。

    这些常量的值可以在程序中使用,以便在不同的平台上保持浮点数操作的一致性和可移植性。通过使用这些常量,您可以编写与浮点数相关的代码,而不需要关心底层平台的具体细节。

    实例 

    以下是一个使用 头文件中常量的示例代码,它检测浮点数的溢出和下溢情况,并将结果输出到标准输出流:

    1. #include
    2. #include
    3. int main() {
    4. float f = FLT_MAX;
    5. double d = DBL_MAX;
    6. long double ld = LDBL_MAX;
    7. // 检查浮点数是否溢出或下溢
    8. if (f > FLT_MAX) {
    9. printf("float 类型的变量 f 溢出\n");
    10. } else if (f < FLT_MIN) {
    11. printf("float 类型的变量 f 下溢\n");
    12. } else {
    13. printf("float 类型的变量 f 未溢出也未下溢\n");
    14. }
    15. if (d > DBL_MAX) {
    16. printf("double 类型的变量 d 溢出\n");
    17. } else if (d < DBL_MIN) {
    18. printf("double 类型的变量 d 下溢\n");
    19. } else {
    20. printf("double 类型的变量 d 未溢出也未下溢\n");
    21. }
    22. if (ld > LDBL_MAX) {
    23. printf("long double 类型的变量 ld 溢出\n");
    24. } else if (ld < LDBL_MIN) {
    25. printf("long double 类型的变量 ld 下溢\n");
    26. } else {
    27. printf("long double 类型的变量 ld 未溢出也未下溢\n");
    28. }
    29. return 0;
    30. }

    该程序首先包含了 头文件。然后,它定义了一个 float 类型的变量 f,一个 double 类型的变量 d 和一个 long double 类型的变量 ld,并将它们分别初始化为它们所能表示的最大值。

    接下来,程序使用 头文件中的常量 FLT_MAX、FLT_MIN、DBL_MAX、DBL_MIN、LDBL_MAX 和 LDBL_MIN 来检测浮点数是否溢出或下溢。如果某个变量的值超过了它所能表示的最大值,则认为它溢出;如果它的值小于它所能表示的最小值,则认为它下溢。

    最后,程序使用 printf() 函数将结果输出到标准输出流。输出语句使用了格式化字符串,其中 %s 表示一个字符串,而 %f 表示一个浮点数。

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

    1. float 类型的变量 f 未溢出也未下溢
    2. double 类型的变量 d 未溢出也未下溢
    3. long double 类型的变量 ld 未溢出也未下溢

    这个示例程序演示了如何使用 头文件中的常量来检测浮点数的溢出和下溢情况,并将结果输出到标准输出流。

  • 相关阅读:
    124. 使用函数节流思想避免 SAP UI5 应用里按钮短时间内被高频重复点击
    docker 部署 coredns(内部域名解析)
    超分辨率重建DRRN
    基于Matlab使用激光雷达检测分类跟踪车辆仿真(附源码)
    【设计模式】简单工厂模式
    Intellij Idea 配置Tomcat(图文详解)
    E5071C是德科技网络分析仪
    Qt QMovie和QLabel配合播放GIF表情包
    你想去外包or外派岗?
    MacOS开发环境搭建
  • 原文地址:https://blog.csdn.net/m0_74293254/article/details/134097744