定义平方根的条件

时间:2018-05-20 20:31:15

标签: c c-preprocessor

此宏用于计算sqrt(x)

#define SQRT(x)     ((x)<=0.0||(x)!=(x)?0.0:sqrt(x))

我无法理解在哪种情况下第二个条件(x)!=(x) 可能是真的吗?

1 个答案:

答案 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不会被触及,并且不会发生浮点异常。

(顺便说一句,如果你在宏参数中有副作用,这个奇怪的宏是不安全的,所以它最好用内联函数或类似函数替换)