如何在Javascript中执行不同底数的对数函数?

6

这个问题是针对Node.js服务器提出的,但我将问题陈述为"JavaScript",因为我可能会在客户端脚本中使用相同的逻辑。

问题如下:给定一组x值,y需要以对数方式缩放。Math对象执行自然对数[ln(x)],但不提供指定对数底数的接口。

作为一个具体的例子,我需要找到以下结果:

log[512](2)

这应该返回.1111~

然而,我没有看到可以实现这一点的接口,也找不到一个公开对数底数选项的库。这肯定是一个常见的问题,并且有解决方案,但我的搜索只找到了与不同/无关问题的解决方案。你有什么想法吗?


可能是重复的问题:有没有办法在JavaScript中指定math.log()的基数? - hippietrail
2个回答

16

你可以使用对数换底公式

log[a](n) = log[b](n) / log[b](a)

所以要得到以512为底,log(2)的值,可以使用:

function log(b, n) {
    return Math.log(n) / Math.log(b);
}

alert(log(2, 512));

请注意上述代码中的Math.log使用的是自然对数底数;换句话说,在数学上应该写成ln


2
JavaScriptеҮҪж•°зҡ„еҶҷжі•зұ»дјјдәҺfunction log(base, number) { return Math.ln(number) / Math.ln(base); }гҖӮ - Dan D.
所以,这最终成为了一个数学问题。天啊,自从我上次做对数问题已经过去好几年了。感谢您的快速修复。 - Aejay
非常正确,我忘记了这是一个JS问题,而不仅仅是数学问题。谢谢! - Platinum Azure
1
实际上,我刚试了一下,应该是“log”,而不是“ln”。让这个问题放置了一年,我感到非常抱歉。 - Platinum Azure
已经一年了吗?哇。感觉就像一个月前我才问过这个问题。顺便说一句,编程中log指的是ln真是有点奇怪;我相信这已经让很多程序员在烦恼的调试中卡壳了。你必须费尽心思去找到或重新创建log[10]这一事实可能会让人感到恼火。 - Aejay

5
我今天在谷歌上找到了这个答案,并且如果其他人也找到了它,那么有一个小错误。正确的版本如下:
function log(b, n) {  
    return Math.log(n) / Math.log(b);  
}

好了,现在已经修复了... :-) - Platinum Azure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接