Вычислить рациональную экспоненту чисел

Недавно я наткнулся на странный вызов, который касался генераторы псевдослучайных чисел в 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 или логарифм?

Nina Scholz 15.09.2018 13:31

Я хотел бы знать, как Math.pow был реализован в JavaScript, но пока мне не повезло. Это похоже на желание узнать, как в языке программирования реализованы генераторы псевдослучайных чисел.

Lapys 15.09.2018 13:32

Я не слежу за этим вопросом ... в чем проблема использования Math.pow(5.16,0.333)?

Gerardo Furtado 15.09.2018 13:38

Дело в том, что Math.pow не написан на Javascript. Базовый движок имеет доступ к более точным числам, код в самом js ограничен числами с 64-битной точностью с плавающей запятой. Чтобы получить большую точность, вам нужно имитировать большие числа с помощью Big int, байтовых массивов или строк и т. д.

Jonas Wilms 15.09.2018 13:46

@GerardoFurtado: Проблема заключается в понимании алгоритма, а не просто в наличии волшебной функции, которая вычисляет ответ за меня.

Lapys 15.09.2018 13:47

@Lapys в этом случае перефразируйте свой вопрос, пояснив, что это - ваша настоящая проблема.

Gerardo Furtado 15.09.2018 13:49

@JonasWilms "Базовый движок имеет доступ к более точным числам." - а? Откуда бы взялись эти цифры?

Bergi 15.09.2018 13:52

@bergi Я бы предположил, что номер js передается какому-то коду С ++, который выполняет вычисления с помощью long, float, double и т. д., а затем преобразует результат обратно в число js и передает его обратно. поправьте меня если я ошибаюсь.

Jonas Wilms 15.09.2018 13:54

@JonasWilms «Дело в том, что Math.pow не написан на Javascript» ... Исходя из этого, ничего такого написан на JS.

Gerardo Furtado 15.09.2018 13:54

@JonasWilms Да, аргументы передаются коду C++, но он остается double.

Bergi 15.09.2018 14:00

@GerardoFurtado Это просто неверное толкование. Math.pow реализован на уровне браузера в нативном коде, еще много чего написано на JS. Что касается исходного вопроса, и Firefox, и Chromium имеют открытый исходный код, вы можете свободно читать их реализации.

Etheryte 15.09.2018 14:01

@nit Я просто попытался найти его в v8 и нашел только некоторые нативные привязки к функции MathPow. Однако неясно, откуда взялась эта функция.

Jonas Wilms 15.09.2018 15:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
12
46
0

Другие вопросы по теме