равен оператору == можно использовать для проверки бита? - PullRequest
4 голосов
/ 18 октября 2011

Какова цель функции?

 bool whatIsIt(double n)
 {
    return n == n;
 }

Может использоваться для проверки каждого бита в n?

Я сомневаюсь в этом.

Любые комментарии приветствуются.

Ответы [ 5 ]

11 голосов
/ 18 октября 2011

Может использоваться для проверки, является ли n NaN (не числом), поскольку NaN не сравнивается равным самому себе.

Вероятно, привередливый и не совсем надежный способ сделать это. (см. различные комментарии Билли) C99 и C ++ 11 имеют функцию isnan().

4 голосов
/ 18 октября 2011

Это указано в Стандарте C в Приложении F: 60559 Арифметика с плавающей запятой, в частности F.8.3 Реляционные операторы:

... Выражение x != x верно, если xa NaN

... Оператор x == x является ложным, если x является NaN

Если __STDC_IEC_559__ равен #defined, то эта функциявернет false если n это NaN.

2 голосов
/ 18 октября 2011

Вероятно, он обнаруживает NaN (которые никогда не равны ничему, даже друг другу), хотя это будет зависеть от вашего конкретного компилятора / платформы / настроек / и т.Строго говоря, в стандарте не говорится, как обрабатывается математика с плавающей запятой.

0 голосов
/ 20 октября 2011

Эта функция проверяет, что число сопоставимо.

Это может быть очень важно для значений, используемых в качестве ключа для функции сортировки или для поиска. Сравнение, используемое в сортировке, предполагает, что если A Технически то, что требуется для сортировки, называется строгим слабым порядком .

Элемент в коллекции, имеющий несопоставимое значение, не найден. Список, который содержит несопоставимое значение, является несортируемым. Кроме того, оптимизированная реализация может выйти из сортируемого массива и начать повреждение памяти или может никогда не завершиться.

Единственное несопоставимое значение, которое я знаю для двойного числа, - это NaN. Как уже отмечали другие, NaN вернет false, если используется как параметр для whatIsIt(). Если NaN является возможным значением для чисел, которые вы сравниваете, то вам придется с этим справиться, иначе могут произойти плохие вещи.

Проблемы с std :: map и NaN упомянуты в этой статье в википедии.

Вы можете построить сравнение для сортировки NaN по заданному месту в списке, но вы не можете сделать это только с помощью встроенных операторов. Вместо этого вы бы сделали что-то вроде

if ( A < B ) then return -1;
else if ( B < A ) then return 1;
else return whatIsIt(A) - whatIsIt(B);

Кроме того, в SQL NULL также нельзя сравнивать в совместимых реализациях.

Загадка в этом заключается в том, почему isnan () не использовался, если это не был вопрос интервью или что-то в этом роде.

0 голосов
/ 18 октября 2011

Нет, это не «проверка битов».

Я предполагаю, что он проверяет «NaN». Он вернет FALSE, если входной сигнал равен NaN, и вернет TRUE, если это любая другая плавающая точказначение.

...