определить условие для квадратного корня - PullRequest
0 голосов
/ 20 мая 2018

Этот макрос предназначен для вычисления sqrt(x),

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

Я не могу понять, в каком случае второе условие (x)!=(x) может быть истинным?

1 Ответ

0 голосов
/ 20 мая 2018

(x) != (x) будет истинным, если x является IEEE 754 Not-a-number (NaN) .Т.е. этот макрос пытается привести результат к 0.0 для значений аргументов, для которых квадратный корень не определен.Справочная страница sqrt (3) Linux хорошо суммирует возвращаемые значения:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

В случае успеха эти функции возвращаютквадратный корень из x.

  • Если x является NaN, возвращается NaN.

  • Если x равно +0 (-0), возвращается +0 (-0).

  • Если x - положительная бесконечность, возвращается положительная бесконечность.

  • Если x меньше -0, возникает ошибка домена и возвращается NaN.

Следовательно, это выражение гарантирует, что вместо NaN будет возвращено 0для 1-го и 4-го случаев, кроме того, errno не трогать, и исключение с плавающей запятой не произойдет.


(Кстати, этот странный макрос небезопасен для использования, если у вас есть побочные эффекты варгумент макроса, поэтому его лучше заменить встроенной функцией или аналогичной)

...