Спецификация ECMAScript для Math.pow
имеет следующее специфическое правило:
- Если x ‹0 и x конечно, y конечно и y не является целым числом, результатом будет NaN.
(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
, которое усекается и теряет точность. Это не такая уж большая проблема, когда мы работаем с положительными числами, потому что мы все равно получаем результат, очень близкий к реальному.
Однако как только мы вступаем в отрицательный мир, у нас возникает проблема. Если бы механизм JavaScript попытался вычислить Math.pow(-823543, 1 / 7)
, ему сначала нужно было бы преобразовать 1 / 7
в десятичное число, так что он действительно будет вычислять Math.pow(-823543, 0.14285714285714285)
, на который на самом деле нет реального ответа. В этом случае ему, возможно, придется вернуть NaN
, поскольку он не смог найти действительное число, хотя реальный ответ должен быть -7
. Более того, поиск комплексных чисел, которые близки к действительным числам, чтобы сделать «наилучшее предположение», может потребовать такого уровня сложности, который они не хотели требовать от JS-движка в математической сфере.
Я предполагаю, что это связано с учетом потери точности в числах с плавающей запятой, что привело их к правилу, согласно которому отрицательные числа в нецелой степени всегда должны быть NaN
- в основном потому, что нецелочисленная степень, вероятно, даст комплексное число в результате потери точности, даже если это не так, и может не быть хорошего способа восстановить его.
Я довольно доволен этим, но приветствую дополнительную информацию.
Pow
комплексного числа) и поиск кубического корня отрицательного числа с помощью функции pow и др. Многие калькуляторы с радостью вычислят(-x)^q
, где-x
отрицательно, аq
- нецелое число, которое выглядит как рациональное с нечетным знаменателем (когда дробь выражается в наименьшем значении). Итак, IEEE отличается от этого. - person Jeppe Stig Nielsen   schedule 30.01.2013