Все, что мне нужно сказать, это: Википедия о NaN.
Написано достаточно четко. Интересно то, что NaN с плавающей запятой общего стандарта выражает NaN следующим образом:
s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx
S — это знак (отрицательный или положительный), 1 — показатель степени, а x — полезная нагрузка.
Глядя на полезную нагрузку, NaN не равен никакому NaN, и есть редкие шансы, что эта информация о полезной нагрузке будет интересна вам как разработчику (например, комплексные числа).
Другое дело, что в стандарте у них есть сигнализация и вполне NaN. Сигнальный NaN (sNaN) означает NaN, который должен вызывать реакцию как исключение. Его следует использовать, чтобы сказать вслух, что у вас есть проблема в вашем уравнении. Тихий NaN (qNaN) — это NaN, который передается молча.
sNaN, который создал сигнал, преобразуется в qNaN, чтобы больше не генерировать никаких сигналов в последующих операциях. Помните, что какая-то система определяет i^0 = 1 как константу, для которой верно NaN^0 = 1. Так что бывают случаи, когда люди рассчитывают с NaN.
Итак, в конце концов, я бы выбрал это: qNaN != sNaN, но это внутреннее и невидимое для пользователя (вы не можете это проверить). Смешайте платеж и знак (да, вы можете иметь отрицательный и положительный NaN), и мне кажется, что всегда возвращается NaN != NaN выглядит гораздо более мудрым выбором, который я, наконец, научился ценить -> Я никогда не буду жаловаться или удивляться еще раз о неравенстве NaN. Слава людям, которые были настолько вдумчивы, что дали нам такой хороший стандарт!
Между прочим: Java использует положительный NaN с полезной нагрузкой 0 (все x равны нулю).
person
Martin Kersten
schedule
21.09.2015