此宏用于计算sqrt(x)
,
#define SQRT(x) ((x)<=0.0||(x)!=(x)?0.0:sqrt(x))
我无法理解在哪种情况下第二个条件(x)!=(x)
可能是真的吗?
答案 0 :(得分:9)
(x) != (x)
是IEEE 754 Not-a-number (NaN),则 x
将为真。即此宏尝试将结果强制为0.0,以获取未定义平方根的参数值。 sqrt(3) Linux man page很好地总结了返回值:
返回值
成功时,这些函数返回x的平方根。
如果
x
是NaN,则返回NaN。如果
x
为+0(-0),则返回+0(-0)。如果
x
为正无穷大,则返回正无穷大。如果
x
小于-0,则会发生域错误,并返回NaN。
因此,这个表达式确保代替NaN,第1和第4个案例将返回0,此外,errno
不会被触及,并且不会发生浮点异常。
(顺便说一句,如果你在宏参数中有副作用,这个奇怪的宏是不安全的,所以它最好用内联函数或类似函数替换)