@khodos_dmitry

Почему при возведении -1000 в 1/3 степень получается Nan?

$number = -1000;
$result = $number ** (1 / 3);
var_dump($result);

Если просто:
$result = -1000 ** (1 / 3);
var_dump($result);

то -10
  • Вопрос задан
  • 199 просмотров
Решения вопроса 2
@alexalexes
Выражение:
$result = -1000 ** (1 / 3);
выполняется с таким приоритетом:
$result = -(1000 ** (1 / 3));
Поэтому тут нет NAN.
Ответ написан
Комментировать
@galaxy
Разный ответ из-за приоритета операций. -1000 ** (1 / 3) вычисляется на самом деле как -(1000 ** (1 / 3))

Если вам интересно, почему в первом случае результат NaN - дело в том, что 1/3 не имеет точного представления в двоичной floating-point форме. Как и любая рациональная дробь, эта будет приближена некоторой дробью вида A/2N (A - нечетное целое). Что равносильно извлечению N квадратных корней из отрицательного числа (-1000)^A
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Maxsior
@Maxsior
loading...
Тут дело в реализации алгоритма возведения в степень. Как и другие численные методы, он не идеален, поэтому не может обработать все случаи входных данных.

Не нашел конкретного алгоритма в спецификации PHP, но в спеке JS, например, этот случай конкретно описан в пункте №12 раздела Number::exponentiate.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽