221

I need a log function for JavaScript, but it needs to be base 10. I can't see any listing for this, so I'm assuming it's not possible. Are there any math wizards out there who know a solution for this?

alexia
  • 14,440
  • 8
  • 42
  • 52
MetaGuru
  • 42,847
  • 67
  • 188
  • 294
  • 6
    There is a Math.log10() method ever since ECMAScript 2015 for those who come here later on. – Haggra Dec 10 '19 at 20:19

10 Answers10

350

"Change of Base" Formula / Identity

The numerical value for logarithm to the base 10 can be calculated with the following identity.

Logarithm for base 10


Since Math.log(x) in JavaScript returns the natural logarithm of x (same as ln(x)), for base 10 you can divide by Math.log(10) (same as ln(10)):

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

Math.LN10 is a built-in precomputed constant for Math.log(10), so this function is essentially identical to:

function log10(val) {
  return Math.log(val) / Math.log(10);
}
Nate Anderson
  • 18,334
  • 18
  • 100
  • 135
Peter
  • 127,331
  • 53
  • 180
  • 211
  • 11
    In fact, any base can be used, not just *e* or 2, as long as both logarithms use the same base. – Joey Jun 10 '10 at 23:40
  • 16
    Added an image with the formula and linked to Wikipedia if you don't mind. – Anurag Jun 10 '10 at 23:40
  • 16
    Wasteful to calculate Math.log(10) each time. Unnecessary to precalculate and store since Math defines this constant already http://www.w3schools.com/jsref/jsref_ln10.asp – Michael Kariv Jun 27 '12 at 08:43
  • 5
    For bases other than 10, scroll down to [CMS's answer](http://stackoverflow.com/a/3019319/568458). If scrolling down and reading an answer sounds like hard work, basic principle is `return Math.log(n) / Math.log(base);` – user56reinstatemonica8 Jan 22 '13 at 11:55
  • 4
    I've noticed some potential room for error here, probably having to do with floating point math. I just tried the function above with a value of 1000 in node, and got a result of 2.9999999999999996. (Although other numbers I tried, such as 10, 100, and even 10000, came out with correct values.) – user4815162342 Apr 13 '13 at 14:44
  • 1
    It's now present in all popular browsers except IE: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10 – Vasanth Sriram Oct 27 '14 at 05:30
  • Might be useful to add `Number.EPSILON` to the result to curb rounding errors. So that `Math.floor(Math.log(1000) / Math.log(10) + Number.EPSILON) === 3` is `true`. – Nickofthyme Feb 05 '21 at 23:39
  • While mathematically correct, since JS uses IEEE754 standard for math, there are rounding errors with floating point arithmetics. Therefore, log base mathematics won't work reliably in JS (or any language that uses IEEE574 for that matter). `Math.log(9) / Math.log(3)` won't be an integer. And adding `Number.EPSILON` as suggested in the previous comment doesn't solve all cases. – Farzad Yousefzadeh Feb 25 '21 at 09:19
  • @MichaelKariv "Wasteful" yet inconsequential in many applications. I think it's a mistake that `Math.LN10` is included in Javascript, b/c that's just one more thing for a programmer to remember. It's trivial to calculate it yourself: `const lg10 = Math.log(10)`, and at least here you don't have to remember more stuff – ICW Jul 23 '22 at 02:52
71

Easy, just change the base by dividing by the log(10). There is even a constant to help you

Math.log(num) / Math.LN10;

which is the same as:

Math.log(num) / Math.log(10);
bramp
  • 9,581
  • 5
  • 40
  • 46
55

You can simply divide the logarithm of your value, and the logarithm of the desired base, also you could override the Math.log method to accept an optional base argument:

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

Math.log(5, 10);
Christian C. Salvadó
  • 807,428
  • 183
  • 922
  • 838
26
const logBase = (n, base) => Math.log(n) / Math.log(base);

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

Yukulélé
  • 15,644
  • 10
  • 70
  • 94
17

the answer here would cause obvious precision problem and is not reliable in some use cases

> 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
Royce Chao
  • 729
  • 6
  • 5
16
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

Then you can do

Math.log10(your_number);

NOTE: Initially I thought to do Math.prototype.log10 = ... to do this, but user CMS pointed out that Math doesn't work this way, so I edited out the .prototype part.

Community
  • 1
  • 1
artlung
  • 33,305
  • 16
  • 69
  • 121
9

FF 25+ supports a Math.log10 method. You may to use polyfill:

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

MDN lists the supported browsers.

Desktop Browsers

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

Mobile Browsers

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
Rahul R.
  • 5,965
  • 3
  • 27
  • 38
Ivan Black
  • 4,827
  • 1
  • 35
  • 33
2

Math.log10(x)!

The top answer is fine for an arbitrary base, but the question is regarding log base 10, and Math.log10(x) has been standard across all browsers since 2015.*

*Except IE, if that's important to you for some reason.

0

If you have a number x, then use of Math.log(x) would essentially be lnx.

To convert it to a base other than e, you can use the following function :

function(x){ return Math.log(x)/Math.log(10); }
Gautam Savaliya
  • 1,403
  • 2
  • 20
  • 31
0

For base 10 use Math.log10().

See docs at: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10

Lukasz Czerwinski
  • 13,499
  • 10
  • 55
  • 65