Как работают корни при x **1/n?
Только начал учить JS, и нашел задание на корни. Дело вроде не трудное, и не требует усилий. Попробовал я формулу x ** (1/n) . Квадратный корень работает идеально, но вот проблема в кубической степени. При 125 из под корня 3, получается не 5 , а 4,999999. Почему оно так работает? UPD : Заметил, что 27 из под корня 3, выдает правильный ответ, другие же увы
function root(x,n){
var result;
result = x ** (1/n);
return result;
}
alert(root(125,3));
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="test.js"></script>
</body>
</html>
Ответы (2 шт):
Скорее всего дело в двоичных числах и иррациональности дроби 1/3, которая не может быть представлена конечным числом бит. В итоге происходит округление показателя степени.
Многие дроби, даже будучи рациональными в десятичной системе, становятся иррациональными в двоичной. Из-за этого число 1/3 представляется как близкое к нему с погрешностью в каком-то далёком от запятой знаке (зависит от точности представления).
Дальше идёт процесс вычислений, в котором идёт одна или более операций. Каждая операция даст погрешность зависимую от погрешности операндов плюс накинет свою. Иногда погрешности гасят друг друга, а иногда складываются. Отсюда и получается, что иногда результат верный, а иногда немного не точный.
В JavaScript есть всего лишь один тип для представления чисел – Number, напоминающий double из Java. Это числа двойной точности (64 разряда) с плавающей точкой, соответствующие стандарту IEEE 754.
Суть концепции чисел с плавающей точкой заключается в разделении одного числа на два:
мантисса, или значимая часть, содержит цифры; экспонента указывает, где в мантиссе необходимо расположить десятичную точку. В самом старшем разряде числа хранится его знак, еще 11 битов отведено под экспоненту, оставшиеся занимает мантисса.
Проблемы такого формата широко известны – он плохо справляется с десятичными дробями. Особенно это важно при работе с денежными суммами. Так, язык JavaScript (и не только он) не может точно представить 0.1 и большую часть других дробей, которые в двоичной системе являются бесконечными.