最近我偶然发现了一个奇怪的挑战,那就是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
方法。
所以我希望社区能够帮助解决这个问题。