iseqsig宏
概要:
#include <math.h>
int iseqsig(real-floating , real-floating );
描述:
关系运算符和相等运算符支持数值间的常用数学关系。对于任何有序数值对有且只有一种关系是正确的,即小于、大于或者等于。当参数是非数值(NaN)时,关系运算符可能会引发FE_INVALID浮点异常。对于一个非数值和一个数值,或者对于两个非数值,只有无序关系(unordered relationship)为真。IEC 60559标准要求:如果操作数比较是无序的,内置关系运算符引发FE_INVALID浮点异常,作为未考虑非数值程序的错误指示符;这种情况下结果为假。
比较宏(comparison macros)有助于编写高效代码,这些代码既能处理安静非数值,又不会引发FE_INVALID浮点异常。
宏iseqsig判断参数和参数是否相等。如果某个参数为非数值,该宏会引发域错误,像函数发生域错误一样。
real-floating表示参数应为实数浮点类型表达式。如果任何参数是整数类型或者非实数浮点类型的其它类型,宏行为是未定义的。两个参数不必是相同类型。比语义类型更宽格式表示的参数是否转换为语义类型是未指定的。如果任一参数为十进制浮点类型,另一参数也应为十进制浮点类型。
参数:
real-floating
参数应为实数浮点类型(例如:float、double、long double)的表达式。
real-floating
参数应为实数浮点类型(例如:float、double、long double)的表达式。
返回值:
如果参数与参数相等,该宏返回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。)
相关内容:
主要参考资料:
1、ISO/IEC 9899:2024