计算数字的有理指数

时间:2018-09-15 11:28:02

标签: javascript

最近我偶然发现了一个奇怪的挑战,那就是JavaScript中的伪随机数生成器 感谢 Stack Overflow 社区对解决问题的回应。

但是现在,我使用非整数计算数字的指数时,“又撞上了墙”。 我已经对方法进行了一些迭代来解决此问题,并通过以下方式在线查看了一些解决方案: 我在这里发布的代码是针对该问题的最接近的解决方案。

在我克服这一挑战之前还有一个小差距,那就是乘以 足够指数,直到在代码开始处成为整数 (标记为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方法。

所以我希望社区能够帮助解决这个问题。

0 个答案:

没有答案