Як я можу вказати базу для Math.log () у JavaScript?


204

Мені потрібна logфункція JavaScript, але вона повинна бути базовою 10. Я не бачу жодного списку для цього, тому припускаю, що це неможливо. Чи є там майстри з математики, які знають рішення для цього?


2
Існує метод Math.log10 () ще з ECMAScript 2015 для тих, хто приходить сюди пізніше.
Хаггра

Відповіді:


329

Формула / особистість «Зміна бази»

Чисельне значення для логарифму до основи 10 можна обчислити з наступною тотожністю.

Логарифм для основи 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
Додано зображення з формулою та пов’язане з Вікіпедією, якщо ви не заперечуєте.
Анураг

13
Марно обчислювати Math.log (10) кожен раз. Не потрібно перераховувати і зберігати, оскільки Math визначає цю константу вже w3schools.com/jsref/jsref_ln10.asp
Майкл Карів

4
Якщо ви не бачите 10, прокрутіть униз до відповіді CMS . Якщо прокручування вниз і читання відповіді звучить як важка робота, основний принципreturn Math.log(n) / Math.log(base);
user56reinstatemonica8

4
Я помітив тут потенційне поле для помилок, ймовірно, це стосується математики з плаваючою комою. Я просто спробував функцію вище зі значенням 1000 у вузлі, і отримав результат 2.9999999999999996. (Хоча інші цифри, які я пробував, наприклад, 10, 100 і навіть 10000, вийшли з правильними значеннями.)
user4815162342

64

Легко, просто поміняйте основу шляхом поділу на колоду (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метод. Ви можете використовувати polyfill:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.