Недавно я наткнулся на странный вызов, который касался генераторы псевдослучайных чисел в JavaScript, к которому Я благодарен сообществу Переполнение стека за реакцию на решение проблемы.
Но теперь я "удариться о другую стену, чтобы перелезть" с точки зрения вычисления экспоненты чисел с использованием нецелых чисел. Я прошел через несколько итераций своего подхода к решению этой проблемы и проверил несколько решений в Интернете с помощью код, который я разместил здесь, является ближайшим решением этой проблемы.
Остается один небольшой пробел, прежде чем я смогу преодолеть эту проблему, и это умножение
экспонента достаточно, пока не станет целым числом в начале кода (часть, обозначенная как PROBLEM).
Это проблема, потому что простые вычисления, такие как переполнение 5.16 ^ .3333, и вычисление неверно.
Мой настоящий вопрос в том, как решить эту проблему.
// Compute base ^ exponent, where base and exponent are rationals numbers.
function pow(base, exponent) {
var denominator = 1, numerator;
// Convert from decimal to fraction
// Multiply the exponent and denominator by 10 to convert them to integers
while (exponent != parseInt(exponent)) {
/* PROBLEM: This becomes infinity after multiplying a few times! */
exponent *= 10;
denominator *= 10
}
numerator = exponent;
var t_x = numerator, t_y = denominator, temp;
while (t_y) {
temp = t_x % t_y;
t_x = t_y;
t_y = temp
}
// Simplify the numerator & denominator expressions to their lowest terms.
numerator /= t_x;
denominator /= t_x;
var iterator = 1,
nextResult, currentResult = 1,
tolerance = 1,
baseRaisedByExponentNumerator = base,
nextResultRaisedByExponentDenominator;
// NOTE: Might be the incorrect way of calculating this...
for (iterator; iterator < numerator; iterator += 1)
baseRaisedByExponentNumerator *= base;
// Newton`s Method iterations
while (tolerance > 1e-3) {
nextResultRaisedByExponentDenominator = currentResult;
for (iterator = 1; iterator < denominator; iterator += 1)
nextResultRaisedByExponentDenominator *= currentResult;
nextResult = currentResult - (nextResultRaisedByExponentDenominator - baseRaisedByExponentNumerator) / (denominator * (nextResultRaisedByExponentDenominator / currentResult));
tolerance = ((nextResult - currentResult) / currentResult) * 100;
(tolerance < 0) && (tolerance *= -1);
currentResult = nextResult
}
// Return
return nextResult
}
Я знаю, что это конкретный вопрос, а не вопрос, основанный на функциях, но в моем исследовании возведения в степень числа с нецелыми числами и имея реализацию этого JavaScript, я почти ничего не нашел.
Цель состоит в том, чтобы понять алгоритм, лежащий в основе такой функции, как Math.pow, которая решает подобные проблемы; Или, по крайней мере, понять, как браузеры, использующие JavaScript, реализуют метод Math.pow.
Так что я очень надеюсь, что сообщество сможет помочь решить эту проблему.
Я хотел бы знать, как Math.pow был реализован в JavaScript, но пока мне не повезло. Это похоже на желание узнать, как в языке программирования реализованы генераторы псевдослучайных чисел.
Я не слежу за этим вопросом ... в чем проблема использования Math.pow(5.16,0.333)?
Дело в том, что Math.pow не написан на Javascript. Базовый движок имеет доступ к более точным числам, код в самом js ограничен числами с 64-битной точностью с плавающей запятой. Чтобы получить большую точность, вам нужно имитировать большие числа с помощью Big int, байтовых массивов или строк и т. д.
@GerardoFurtado: Проблема заключается в понимании алгоритма, а не просто в наличии волшебной функции, которая вычисляет ответ за меня.
@Lapys в этом случае перефразируйте свой вопрос, пояснив, что это - ваша настоящая проблема.
@JonasWilms "Базовый движок имеет доступ к более точным числам." - а? Откуда бы взялись эти цифры?
@bergi Я бы предположил, что номер js передается какому-то коду С ++, который выполняет вычисления с помощью long, float, double и т. д., а затем преобразует результат обратно в число js и передает его обратно. поправьте меня если я ошибаюсь.
@JonasWilms «Дело в том, что Math.pow не написан на Javascript» ... Исходя из этого, ничего такого написан на JS.
@JonasWilms Да, аргументы передаются коду C++, но он остается double.
@GerardoFurtado Это просто неверное толкование. Math.pow реализован на уровне браузера в нативном коде, еще много чего написано на JS. Что касается исходного вопроса, и Firefox, и Chromium имеют открытый исходный код, вы можете свободно читать их реализации.
@nit Я просто попытался найти его в v8 и нашел только некоторые нативные привязки к функции MathPow. Однако неясно, откуда взялась эта функция.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


почему бы не взять
Math.powили логарифм?