如何在 JavaScript 中指定 Math.log() 的基数?

Posted

技术标签:

【中文标题】如何在 JavaScript 中指定 Math.log() 的基数?【英文标题】:How can I specify the base for Math.log() in JavaScript? 【发布时间】:2011-03-02 10:45:26 【问题描述】:

我需要一个用于 javascriptlog 函数,但它需要以 10 为基数。我看不到任何列表,所以我假设这是不可能的。有没有知道解决这个问题的数学奇才?

【问题讨论】:

自 ECMAScript 2015 以来就有一个 Math.log10() 方法供以后来这里的人使用。 【参考方案1】:

“基础改变”公式/身份

可以计算以10为底的对数数值 具有以下身份。


由于 JavaScript 中的 Math.log(x) 返回 x 的自然对数(与 ln(x) 相同),以 10 为底,您可以除以 Math.log(10)(与 ln 相同) (10)):

function log10(val) 
  return Math.log(val) / Math.LN10;

Math.LN10Math.log(10) 的内置预计算常量,因此该函数本质上等同于:

function log10(val) 
  return Math.log(val) / Math.log(10);

【讨论】:

其实任何底都可以使用,不只是e或2,只要两个对数使用同一个底即可。 如果您不介意,请添加带有公式的图像并链接到***。 每次计算 Math.log(10) 很浪费。无需预先计算和存储,因为 Math 已经定义了这个常量 w3schools.com/jsref/jsref_ln10.asp 对于 10 以外的碱基,向下滚动到 CMS's answer。如果向下滚动并阅读答案听起来很辛苦,那么基本原则是return Math.log(n) / Math.log(base); 我注意到这里有一些潜在的错误空间,可能与浮点数学有关。我刚刚在节点中尝试了上面的函数,值为 1000,结果为 2.9999999999999996。 (尽管我尝试过的其他数字,例如 10、100 甚至 10000,都得到了正确的值。)【参考方案2】:

很简单,只需通过除以 log(10) 来更改基数。甚至还有一个常数可以帮助你

Math.log(num) / Math.LN10;

等同于:

Math.log(num) / Math.log(10);

【讨论】:

【参考方案3】:

您可以简单地将值的对数除以所需基数的对数,也可以覆盖Math.log 方法以接受可选的基数参数:

Math.log = (function() 
  var log = Math.log;
  return function(n, base) 
    return log(n)/(base ? log(base) : 1);
  ;
)();

Math.log(5, 10);

【讨论】:

【参考方案4】:

这里的答案会导致明显的精度问题,并且在某些用例中不可靠

> Math.log(10)/Math.LN10
1

> Math.log(100)/Math.LN10
2

> Math.log(1000)/Math.LN10
2.9999999999999996

> Math.log(10000)/Math.LN10
4

【讨论】:

通过选择性舍入调整精度:(Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)【参考方案5】:
Math.log10 = function(n) 
    return (Math.log(n)) / (Math.log(10));

那你就可以了

Math.log10(your_number);

注意:最初我想通过Math.prototype.log10 = ... 来执行此操作,但用户CMS 指出Math 不能这样工作,所以我编辑了.prototype 部分。

【讨论】:

Math 是一个对象,而不是构造函数,因此它没有prototype 属性。 感谢 CMS。证明一个人应该在感到“受到启发”之前进行测试。我会回到绘图板。 只需删除.prototype 部分;)【参考方案6】:
const logBase = (n, base) => Math.log(n) / Math.log(base);

https://en.wikipedia.org/wiki/Logarithm#Change_of_base

【讨论】:

【参考方案7】:

FF 25+ 支持Math.log10 方法。你可以使用 polyfill:

if (!Math.log10) Math.log10 = function(t) return Math.log(t)/Math.LN10; ;

MDN 列出了supported browsers。

桌面浏览器

Chrome    Firefox (Gecko) Internet Explorer   Opera   Safari
38        25 (25)         Not supported       25      7.1

移动浏览器

android         Chrome for Android    Firefox Mobile (Gecko)  IE Mobile      Opera Mobile    Safari Mobile
Not supported   Not supported         25.0 (25)               Not supported  Not supported   ios 8

【讨论】:

【参考方案8】:

Math.log10(x)! ?

最佳答案对于任意基数都可以,但问题是关于以 10 为基数的日志,Math.log10(x) 一直是 standard across all browsers since 2015.*

*IE 除外,如果出于某种原因这对您很重要。

【讨论】:

【参考方案9】:

如果你有一个数字 x,那么使用 Math.log(x) 本质上就是 lnx。

要将其转换为 e 以外的基数,可以使用以下函数:

function(x) return Math.log(x)/Math.log(10); 

【讨论】:

【参考方案10】:

对于基数为 10 的用户,请使用 Math.log10()

请参阅文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10

【讨论】:

以上是关于如何在 JavaScript 中指定 Math.log() 的基数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Meteor (JavaScript) 中指定内容类型

从数组中删除一个元素,在Javascript中指定一个值

JavaScript 在JavaScript中指定引用页面

在JavaScript中指定引用页

在JavaScript中指定引用页

如何在 Postman Collection 中指定 JSON 请求正文示例