Почему 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, что истинно (, но в основном ничего, кроме нулевого/нулевого/пустого, истинно), поэтому сравнение будет истинным, если другая сторона также истинна.