Почему NAN не соответствует всем, кроме true, в PHP?

В PHP NAN сравнивает false с 0, "0", false, array(), array(1), NAN, null и в основном каждый другой класс переменной, который я мог бы различить.

Но NAN == true возвращает true. Почему NAN == true возвращает true?

Ответы

Ответ 1

NAN (вполне NAN или NAN сигнализации) - это отличное от нуля значение с плавающей запятой. * Вот почему *

sqrt(-1.0) -> NAN

Существует -NAN и + NAN, хотя, начиная примерно с 80286, он обычно распознается как тест NAN.

Проверьте набор команд с плавающей запятой FPU, если вам нужно.

+ INF и -INF также отличные от нуля значения с плавающей запятой:

- log(0.0) -> +INF
log(0.0) -> -INF

Вот дамп стека с плавающей запятой Intel. Я просто перечислил несколько значений, о которых я говорил: (не забывайте, внутренне, FPU составляет 10 байт):

     <exp>  <mantissa>
0.0  00 00 00 00 00 00 00 00 00 00
-INF FF FF 80 00 00 00 00 00 00 00
+INF 7F FF 80 00 00 00 00 00 00 00
-NAN FF FF C0 00 00 00 00 00 00 00
+NAN 7F FF C0 00 00 00 00 00 00 00

Итак, как вы можете видеть, только 0.0 - ZERO!

Ответ 2

В php $x == true это то же самое, что и $x? true : false. То есть сравнение с true с ==, а не === означает, что $x будет оценивать true в булевом контексте.

Если NAN должно было вычисляться как false в булевом контексте, NAN == false вместо этого вычислял бы true.

Ответ 3

По той же причине is_numeric(NAN) возвращает true.

Ответ 4

Я думаю, что они исправили его в более поздней версии PHP. Я использую 5.2, а NAN фактически равен false.

вот мой код

<?php
var_dump(PHP_VERSION); //string(6) "5.2.17"
if(NAN == false)
{
    echo "false";
}

if(NAN == true)
{
    echo "true";
}
//This only print out "false".
?>

Ответ 5

Смысл оператора == - "операнды равны после манипуляции типа" (в отличие от ===, что означает, что "операнды равны и имеют один и тот же тип" ). Вы можете найти точные (и довольно произвольные) правила в руководстве, но когда один из операндов является числовым, тип жонглирования может принимать три формы

  • другой операнд является логическим или нулевым → обе стороны преобразуются в логические и сравниваются
  • другой операнд - это массив или объект → никогда не равный, манипуляция типа не выполняется
  • другой операнд - это строка, число или ресурс → он преобразуется в число и сравнивается

Таким образом, в случае 2. результат является ложным по определению, в 3. он неверен, потому что NAN по сравнению с любым числовым значением является ложным, а в 1. NAN преобразуется в boolean, что истинно (, но в основном ничего, кроме нулевого/нулевого/пустого, истинно), поэтому сравнение будет истинным, если другая сторона также истинна.