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?
"Change of Base" Formula / Identity
The numerical value for logarithm to the base 10 can be calculated with the following identity.
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);
}
return Math.log(n) / Math.log(base);
–
Domain Number.EPSILON
to the result to curb rounding errors. So that Math.floor(Math.log(1000) / Math.log(10) + Number.EPSILON) === 3
is true
. –
Lynching 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. –
Batholomew 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 –
Bainbrudge 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);
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);
const logBase = (n, base) => Math.log(n) / Math.log(base);
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
(Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
–
Wastrel 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.
Math
is an object, not a constructor function, therefore it doesn't have a prototype
property. –
Athelstan .prototype
part ;) –
Athelstan 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
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.
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); }
For base 10 use Math.log10()
.
See docs at: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10
© 2022 - 2024 — McMap. All rights reserved.