как работает isNan()?

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; но как это реализовано. Поэтому, пожалуйста, направьте свои ответы на фактическую реализацию низкого уровня.

Любая помощь приветствуется. Спасибо.


person Selvin    schedule 08.04.2014    source источник
comment
но как это реализовано - я не думаю, что вы понимаете вопрос, который задаете. Арифметика над NaN (и другими числами с плавающей запятой) реализована в микрокоде вашего компьютера. Сравнение NaN с NaN дает не равно ... потому что это так; потому что это указано. Как это реализовано? Получая not equal всякий раз, когда сравниваются NaN. На самом деле больше нечего сказать об этом.   -  person Jim Balter    schedule 08.04.2014


Ответы (1)


CF http://en.wikipedia.org/wiki/NaN

Сравнение с NaN всегда возвращает неупорядоченный результат, даже при сравнении с самим собой.

Значит, NaN ВСЕГДА отличается от того, что вы тоже сравниваете :)

Я полагаю, что у компилятора/ЦП есть свой способ проверки этого специального значения, возможно, кто-то может дать лучший ответ, чем я, о реализации...

person Antzi    schedule 08.04.2014
comment
И что важно, любое число, кроме NaN, равно самому себе. Да, FPU просто реализует стандарт IEEE 754. - person gnasher729; 08.04.2014
comment
у компилятора/процессора есть свой способ проверки этого специального значения - конечно, есть способ: битовые конфигурации для NaN четко определены. Но компилятору все равно; все это делается в микрокоде модуля с плавающей запятой. - person Jim Balter; 08.04.2014
comment
@JimBalter все это делается в микрокоде ... Это утверждение справедливо для каждой архитектуры? - person Antzi; 08.04.2014