JavaScriptでMath.log()のベースを指定するにはどうすればよいですか?


204

logJavaScript用の関数が必要ですが、ベースは10である必要があります。これに関するリストが表示されないので、不可能だと思います。これの解決策を知っている数学の魔法使いはいますか?


2
ECMAScript 2015以降、ここに来る人のためにMath.log10()メソッドがあります。
Haggra

回答:


329

「ベースの変更」フォーミュラ/アイデンティティ

10を底とする対数の数値は、次の式で計算できます。

10を底とする対数


Math.log(x)JavaScriptではxln(x)と同じ)の自然対数を返すため、10を底とする場合はMath.log(10)ln(10)と同じ)で除算できます。

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

Math.LN10はの組み込みの事前計算済み定数なMath.log(10)ので、この関数は基本的に次のものと同じです:

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

10
実際、両方の対数が同じ底を使用する限り、eまたは2 だけでなく、任意の底を使用できます。
Joey

16
数式を含む画像を追加し、ウィキペディアにリンクしました。
Anurag

13
毎回Math.log(10)を計算するのは無駄です。Mathはすでにこの定数を定義しているため、事前計算して保存する必要はありませんw3schools.com/jsref/jsref_ln10.asp
Michael Kariv

4
10以外のベースの場合は、CMSの回答まで下にスクロールします。下にスクロールして解答を読むのが大変な作業のように聞こえる場合、基本的な原則はreturn Math.log(n) / Math.log(base);
user56reinstatemonica8

4
ここでエラーの潜在的な余地があることに気付きました。おそらく浮動小数点演算に関係しています。上記の関数をノードの値1000で試したところ、結果は2.9999999999999996になりました。(
10、100

64

簡単です。log(10)で割って底を変更するだけです。あなたを助ける定数さえあります

Math.log(num) / Math.LN10;

これは次と同じです:

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

52

値の対数と目的の底の対数を単純に除算できます。またMath.log、オプションの底引数を受け入れるようにメソッドをオーバーライドすることもできます。

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

Math.log(5, 10);

15

ここでの答えは明らかな精度の問題を引き起こし、一部のユースケースでは信頼できません

> 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
選択丸め精度を調整します (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
シェーンダニエル


13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

その後、行うことができます

Math.log10(your_number);

注:最初Math.prototype.log10 = ...はこれを行うことを考えましたが、ユーザーCMSはMathがこのように機能しないことを指摘したので、.prototypeパーツを編集しました。


3
Mathオブジェクトであり、コンストラクタ関数ではないため、prototypeプロパティはありません。
CMS

CMSに感謝します。「インスピレーション」を感じる前に、物事をテストする必要があることを証明します。描画パッドに戻ります。
artlung

3
.prototype部品を外すだけです;)
CMS

9

FF 25+はMath.log10メソッドをサポートしています。あなたはポリフィルを使うかもしれません:

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

MDNはサポートされているブラウザをリストします

デスクトップブラウザ

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


0

数値xを持っている場合、の使用Math.log(x)は本質的にlnxになります。

e以外のベースに変換するには、次の関数を使用できます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.