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?


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);
}

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);

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);

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

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.


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


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); }

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.