JavaScript에서 Math.log ()의 기본을 어떻게 지정할 수 있습니까?


204

logJavaScript 용 함수 가 필요 하지만 기본 10이어야합니다. 이에 대한 목록을 볼 수 없으므로 불가능하다고 가정합니다. 이에 대한 해결책을 아는 수학 마법사가 있습니까?


2
ECMAScript 2015 이후로 여기에 온 사람들을 위해 Math.log10 () 메소드가 있습니다.
Haggra

답변:


329

"기초의 변화"공식 / 정체성

밑이 10 인 로그의 숫자 값은 다음과 같은 ID로 계산할 수 있습니다.

밑이 10 인 로그


Math.log(x)JavaScript에서 x( ln (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
마음에 들지 않으면 수식이 포함 된 이미지를 추가하고 Wikipedia에 연결했습니다.
Anurag 2016 년

13
매번 Math.log (10)를 계산하는 것은 낭비입니다. 수학은 이미 상수를 정의하기 때문에 미리 계산하고 저장하는 것이 불필요한 w3schools.com/jsref/jsref_ln10.asp
마이클 Kariv을

4
10이 아닌 다른 염기의 경우 CMS의 답변으로 스크롤하십시오 . 아래로 스크롤하여 답을 읽는 것이 어려운 일처럼 들리면 기본 원칙은 다음과 같습니다.return Math.log(n) / Math.log(base);
user56reinstatemonica8

4
부동 소수점 수학과 관련이있을 수있는 잠재적 인 오류가 있음을 알았습니다. 방금 노드에서 1000 값으로 위의 함수를 시도하고 결과는 2.9999999999999996입니다. (10, 100, 심지어 10000과 같은 다른 숫자도 올바른 값으로 나왔습니다.)
user4815162342

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 2016 년

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.