Спецификация ECMAScript для Math.pow
имеет следующее своеобразное правило:
- Если x
( http://es5.github.com/#x15.8.2.13 )
В результате Math.pow(-8, 1 / 3)
дает NaN
довольно чем -2
В чем причина этого правила? Есть ли какая-то более широкая компьютерная наука или IEEEish причина для этого правила, или это просто выбор TC39 / Eich, сделанный когда-то?
Благодаря обменам Амадана со мной, я думаю, что теперь понимаю причину. Я хотел бы расширить нашу дискуссию ради потомков.
Давайте возьмем следующий пример: Math.pow(823543, 1 / 7)
приводит к 6.999999999999999
, хотя это действительно должно быть 7
. Это неточность, связанная с тем, что сначала необходимо преобразовать 1 / 7
в десятичное представление 0.14285714285714285
, которое усекается и теряет точность. Это не такая плохая проблема, когда мы работаем с положительными числами, потому что мы все еще получаем результат, который очень близок к реальному результату.
1126 Однако, как только мы вступаем в отрицательный мир, у нас возникает проблема. Если бы движок JavaScript пытался вычислить Math.pow(-823543, 1 / 7)
, то сначала нужно было бы преобразовать 1 / 7
в десятичное число, поэтому на самом деле это были бы вычисления Math.pow(-823543, 0.14285714285714285)
, которые на самом деле не имеют реального ответа . В этом случае, возможно, придется вернуть NaN
, так как он не может найти действительное число, даже если реальный ответ должен быть -7
. Кроме того, поиск комплексных чисел, близких к действительным числам, чтобы сделать «наилучшее предположение», может включать уровень сложности, который они не хотели требовать от движка JS на математической арене.
Я предполагаю, что это связано с рассмотрением потери точности в числах с плавающей запятой, что привело их к правилу, что отрицательные числа с нецелой степенью всегда должны быть NaN
- в основном потому, что нецелые сила, вероятно, даст комплексное число в результате потери точности, даже если это не так, и, возможно, нет хорошего способа восстановить ее.
1128 Этим я вполне доволен, но приветствую дополнительную информацию.