Comment spécifier la base de Math.log () en JavaScript?

205

J'ai besoin d'une logfonction pour JavaScript, mais elle doit être en base 10. Je ne vois aucune liste pour cela, donc je suppose que ce n'est pas possible. Y a-t-il des magiciens des mathématiques qui connaissent une solution?

MetaGuru
la source
2
Il existe une méthode Math.log10 () depuis ECMAScript 2015 pour ceux qui viendront ici plus tard.
Haggra

Réponses:

330

Formule / identité "Changement de base"

La valeur numérique du logarithme à la base 10 peut être calculée avec l'identité suivante.

Logarithme pour la base 10


Comme Math.log(x)en JavaScript renvoie le logarithme naturel de x(identique à ln (x) ), pour la base 10, vous pouvez diviser par Math.log(10)(identique à ln (10) ):

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

Math.LN10est une constante précalculée intégrée pour Math.log(10), donc cette fonction est essentiellement identique à:

function log10(val) {
  return Math.log(val) / Math.log(10);
}
Peter
la source
10
En fait, n'importe quelle base peut être utilisée, pas seulement e ou 2, tant que les deux logarithmes utilisent la même base.
Joey
16
Ajout d'une image avec la formule et liée à Wikipedia si cela ne vous dérange pas.
Anurag
13
Du gaspillage pour calculer Math.log (10) à chaque fois. Inutile de précalculer et de stocker car Math définit déjà cette constante w3schools.com/jsref/jsref_ln10.asp
Michael Kariv
4
Pour les bases autres que 10, faites défiler jusqu'à la réponse de CMS . Si faire défiler vers le bas et lire une réponse semble être un travail difficile, le principe de base estreturn Math.log(n) / Math.log(base);
user56reinstatemonica8
4
J'ai remarqué une marge d'erreur potentielle ici, probablement liée aux mathématiques en virgule flottante. Je viens d'essayer la fonction ci-dessus avec une valeur de 1000 dans le nœud et j'ai obtenu un résultat de 2,9999999999999996. (Bien que d'autres nombres que j'ai essayés, tels que 10, 100 et même 10000, soient sortis avec des valeurs correctes.)
user4815162342
64

Facile, il suffit de changer la base en la divisant par la bûche (10). Il y a même une constante pour vous aider

Math.log(num) / Math.LN10;

ce qui équivaut à:

Math.log(num) / Math.log(10);
bramp
la source
52

Vous pouvez simplement diviser le logarithme de votre valeur et le logarithme de la base souhaitée, vous pouvez également remplacer la Math.logméthode pour accepter un argument de base facultatif:

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

Math.log(5, 10);
CMS
la source
15

la réponse ici causerait un problème de précision évident et n'est pas fiable dans certains cas d'utilisation

> 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
la source
8
Ajustez la précision avec l'arrondi sélectif: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel
13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

Ensuite, vous pouvez faire

Math.log10(your_number);

NOTE: Au départ, je pensais Math.prototype.log10 = ...faire cela, mais le CMS utilisateur a souligné que les mathématiques ne fonctionnent pas de cette façon, j'ai donc édité la .prototypepartie.

artlung
la source
3
Mathest un objet, pas une fonction constructeur, donc il n'a pas de prototypepropriété.
CMS
merci CMS. Prouve qu'il faut tester les choses avant de se sentir «inspiré». Je reviens au bloc de dessin.
artlung
3
Il suffit de retirer la .prototypepièce;)
CMS
9

FF 25+ prend en charge une Math.log10méthode. Vous pouvez utiliser polyfill:

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

MDN répertorie les navigateurs pris en charge .

Navigateurs de bureau

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

Navigateurs mobiles

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
Ivan Black
la source
1

Math.log10(x)! 😁

La première réponse est correcte pour une base arbitraire, mais la question concerne la base de journal 10 et Math.log10(x)est standard sur tous les navigateurs depuis 2015. *

* Sauf IE, si cela est important pour vous pour une raison quelconque.

Haumed Rahmani
la source
0

Si vous avez un nombre x, alors l'utilisation de Math.log(x)serait essentiellement lnx.

Pour le convertir en une base autre que e, vous pouvez utiliser la fonction suivante:

function(x){ return Math.log(x)/Math.log(10); }
Kartik Singh
la source