Подтвердить что ты не робот

Почему Rust не реализует полное упорядочение через черту Ord для f64 и f32?

В то время как все целые типы в Rust реализуют Ord, который подчеркивает полное упорядочение, типы с плавающей запятой реализуют только PartialOrd. Это означает, что могут быть значения с плавающей запятой, которые нельзя сравнивать. Это сложно переварить, поскольку числа с плавающей запятой можно рассматривать как приближения к действительным числам, которые являются полностью упорядоченным множеством. Даже добавление положительной и отрицательной бесконечности позволяет полностью упорядочить множество действительных чисел. Почему этот странный выбор в Rust?

Это ограничение означает, что общий алгоритм сортировки/поиска может принимать только частичный порядок чисел. Стандарт IEEE 754, как представляется, обеспечивает общий предикат порядка.

Является ли NaN проблемой в общем коде?

4b9b3361

Ответ 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, выбирать его из библиотеки или даже сами определять.