当前位置: C语言 -- 标准库 -- <math.h> -- iseqsig

iseqsig宏


概要:
#include <math.h>
int iseqsig(real-floating x, real-floating y);

描述:

关系运算符和相等运算符支持数值间的常用数学关系。对于任何有序数值对有且只有一种关系是正确的,即小于、大于或者等于。当参数是非数值(NaN)时,关系运算符可能会引发FE_INVALID浮点异常。对于一个非数值和一个数值,或者对于两个非数值,只有无序关系(unordered relationship)为真。IEC 60559标准要求:如果操作数比较是无序的,内置关系运算符引发FE_INVALID浮点异常,作为未考虑非数值程序的错误指示符;这种情况下结果为假。

比较宏(comparison macros)有助于编写高效代码,这些代码既能处理安静非数值,又不会引发FE_INVALID浮点异常。


宏iseqsig判断参数x和参数y是否相等。如果某个参数为非数值,该宏会引发域错误,像函数发生域错误一样。

real-floating表示参数应为实数浮点类型表达式。如果任何参数是整数类型或者非实数浮点类型的其它类型,宏行为是未定义的。两个参数不必是相同类型。比语义类型更宽格式表示的参数是否转换为语义类型是未指定的。如果任一参数为十进制浮点类型,另一参数也应为十进制浮点类型。


参数:
real-floating x

参数应为实数浮点类型(例如:float、double、long double)的表达式。

real-floating y

参数应为实数浮点类型(例如:float、double、long double)的表达式。


返回值:

如果参数x与参数y相等,该宏返回1;否则该宏返回0。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
/*宏iseqsig范例*/

#include <errno.h>
#include <fenv.h>
#include <math.h>
#include <stdio.h>

//输出错误的函数。
void showError(void)
{
    //判断是否出错。
    if(errno != 0)
    {
        //判断错误类型。
        switch(errno)
        {
            case EDOM:puts("Error: out of domain");
                      break;
            case ERANGE:puts("Error: out of range");
                        break;
            case EILSEQ:puts("Error: illegal byte sequence");
                        break;
            default:puts("Other errors");
                    break;
        }
    }
}

//输出浮点异常的函数。
void showExceptions(void)
{
    printf("Exceptions: ");
    //判断是否设置浮点异常。
    if(fetestexcept(FE_ALL_EXCEPT)==0)
    {
        puts("No floating-point status flag is set.");
    }
    else
    {
    	//判断设置的浮点异常。
        if(fetestexcept(FE_DIVBYZERO))
            printf("FE_DIVBYZERO ");
        if(fetestexcept(FE_INEXACT))
            printf("FE_INEXACT ");
        if(fetestexcept(FE_INVALID))
            printf("FE_INVALID ");
        if(fetestexcept(FE_OVERFLOW))
            printf("FE_OVERFLOW ");
        if(fetestexcept(FE_UNDERFLOW))
            printf("FE_UNDERFLOW ");
        puts("");
    }
}

int main(void)
{
    float nan_value = NAN;
    float value = 1.0f;
    
    errno = 0;
    feclearexcept(FE_ALL_EXCEPT);
    
    #if __STDC_VERSION_MATH_H__ >= 202311L 
        if(iseqsig(value, nan_value))
        {
            puts("The arguments are equal.");
        }
        else
        {
            puts("The arguments are not equal.");
        }
        
        showError();        
        showExceptions();
    #else
        puts("The implementation does not support iseqsig macro.");
    #endif

    return 0;
}

可能输出:

The arguments are not equal.

Error: out of domain

(注:编译时实现还未支持宏iseqsig。)


相关内容:
isgreater 判断第一个参数是否大于第二个参数的宏。
isgreaterequal 判断第一个参数是否大于等于第二个参数的宏。
isless 判断第一个参数是否小于第二个参数的宏。
islessequal 判断第一个参数是否小于等于第二个参数的宏。
islessgreater 判断第一个参数是否小于或者大于第二个参数的宏。
isunordered 判断参数是否无序的宏。


主要参考资料:

1、ISO/IEC 9899:2024