Ответ 1
Каков ваш вопрос, точно? Вы спрашиваете, существует ли NaN, или можно ли получить его в результате случайных или добровольных вычислений? Да, это так и есть. Тип данных, который требует полного порядка для ключей, полностью разрушается, когда предоставленный заказ не является полным порядком. Вы не хотите, чтобы даже одно исключительное значение отличалось от самого себя, потому что оно нарушало бы инварианты структуры и означало, что отныне что-то может произойти. NaN не является чем-то, что следует считать безобидным до тех пор, пока не будет показана никакая проблема, хотя который был опробован на других языках.
Определение обычных операторов сравнения <
, <=
, IEEE 754 делает их очень полезными в общем случае, если не требуется общий порядок. В частности, легко записать условия, чтобы входы ошибок были отправлены в ветвь ошибки:
if (!(x <= MAX)) { // NaN makes this condition true
error();
}
if (!(x >= MIN)) { // NaN makes this condition true
error();
}
Поскольку <
и <=
настолько полезны, они являются операциями, реализованными как единые быстрые инструкции в современных процессорах - предикат totalOrder от IEEE 754 обычно не реализован в аппаратном обеспечении. Языки программирования отображают быстрые инструкции для построения на языке и оставляют всех, кто исключительно нуждается в totalOrder, выбирать его из библиотеки или даже сами определять.