Важно : ответ @ harold почти верный, но имеет тонкий неправильный аспект, который может привести вас в бешенство в очень важном случае - обработка NaN обратна большинству языков (например, c ++)).
Как правильно говорит @harold, неупорядоченный результат сравнения сохраняется во флаге четности.
Однако неупорядоченное сравнение имеет значение true, если какой-либо операнд равен NaN , как подробнов этот пост переполнения стека .Это означает, что NaN
будет меньше, равно и больше абсолютно каждого числа , включая NaN
.
Так что если вы хотите, чтобы ваш язык соответствовал языку c ++поведение, когда любое сравнение с NaN возвращает false, вы хотите:
Для <=
:
ucomisd xmm0, xmm1
jbe else_label
Для <
:
ucomisd xmm0, xmm1
jb else_label
Подтверждено впосле разборки gcc, где I return a >= b
:
144e: 66 0f 2e c8 ucomisd %xmm0,%xmm1
1452: 0f 93 c0 setae %al
Здесь используется setae
, который является модификатором регистра, эквивалентным jae
.Затем он немедленно возвращается, не проверяя флаг четности.
Почему его ja
, а не jg
, ответ @ harold по-прежнему является четким и правильным объяснением.
И, конечно, выне нужно использовать упорядоченное сравнение, вы можете использовать неупорядоченное сравнение, как показано в предыдущем ответе, если вы хотите, чтобы абсолютно все числа были меньше, больше, чем и равными NaN
в вашей программе /язык (где даже NaN < NaN
верно!).И, конечно, как вы можете видеть, он может быть немного медленнее, поскольку требует дополнительных проверок.