isNan определяется следующим образом в iOS SDK, math.h, как показано ниже,
#define isnan(x) \
( sizeof(x) == sizeof(float) ? __inline_isnanf((float)(x)) \
: sizeof(x) == sizeof(double) ? __inline_isnand((double)(x)) \
: __inline_isnanl((long double)(x)))
И встроенная функция выглядит так:
__header_always_inline int __inline_isnanf(float __x) {
return __x != __x;
}
__header_always_inline просто заставляет компилятор сделать функцию обязательно встроенной.
То, что на самом деле было сделано во встроенной функции, на мой взгляд довольно уклончиво.
return __x != __x;
Что делает эта строка? Как он проверяет, является ли аргумент NaN или нет?
Изменить:
Здесь вопрос НЕ в том, почему NaN не равен NaN; но как это реализовано. Поэтому, пожалуйста, направьте свои ответы на фактическую реализацию низкого уровня.
Любая помощь приветствуется. Спасибо.