Log1p: примеры (JAVASCRIPT)
log1p(number): numberОписание функции Math.log1p()
Функция Math.log1p() возвращает натуральный логарифм (логарифм по основанию e) от числа x + 1. Её основное назначение — повышение точности вычисления логарифмов для чисел, близких к нулю. Это связано с тем, что при сложных вычислениях или при работе с очень малыми значениями прямое вычисление Math.log(1 + x) может привести к потере точности из-за особенностей представления чисел с плавающей запятой.
Синтаксис функции: Math.log1p(x).
Аргументы:
x: Число, значение от которого вычисляетсяln(x + 1). Может быть любым числовым типом.
Возвращаемое значение:
- Натуральный логарифм числа
(x + 1). - Если
xравен -1, возвращает-Infinity. - Если
xменьше -1, возвращаетNaN. - Если
xравен+Infinity, возвращает+Infinity. - Если
xравен-Infinity, возвращаетNaN.
Простыe примеры использования
Базовое применение с положительным числом:
console.log(Math.log1p(0));
// x = 0, вычисляется ln(1)
0
Использование с числом, близким к нулю:
console.log(Math.log1p(1e-15));
9.999999999999995e-16
Результат для аргумента -1:
console.log(Math.log1p(-1));
-Infinity
Аргумент меньше -1 приводит к NaN:
console.log(Math.log1p(-2));
NaN
Похожие функции в JavaScript
Math.log(x): вычисляет натуральный логарифм непосредственно от x. Используется, когда не требуется повышенная точность для значений 1 + x при малых x. Для вычисления логарифма по другим основаниям применяют формулу с Math.log.
Math.log10(x) и Math.log2(x): вычисляют логарифм по основанию 10 и 2 соответственно. Их используют в специфических областях, например, в информатике или при работе с десятичными порядками величины.
Math.expm1(x): является обратной по смыслу к log1p, вычисляет e^x - 1 с повышенной точностью для малых x. Эти две функции часто применяют вместе в финансовых вычислениях и статистике.
Аналоги функции в других языках
Python: функция math.log1p(x) из модуля math. Имеет идентичное назначение и поведение.
import math
print(math.log1p(1e-9))
9.999999995e-10
PHP: функция log1p(). Работает аналогично.
echo log1p(0.5);
0.40546510810816
C/C++: функция log1p() объявлена в заголовочном файле <math.h>. Обеспечивает повышенную точность, как и в других языках.
#include <math.h>
#include <stdio.h>
int main() {
printf("%f\n", log1p(0.01));
return 0;
}
0.009950
MySQL: функция LOG1P(). Возвращает значение натурального логарифма аргумента, увеличенного на единицу.
SELECT LOG1P(0);
0
Типичные ошибки
Основная ошибка — передача аргумента, приводящего к логарифму отрицательного числа.
console.log(Math.log1p(-1.5)); // x + 1 = -0.5
NaN
Некорректная передача нечислового аргумента, который может быть неявно преобразован. Логика преобразования соответствует стандартным правилам JavaScript.
console.log(Math.log1p("1")); // Строка преобразуется в число 1
0.6931471805599453
console.log(Math.log1p("abc")); // Нечисловая строка
NaN
Путаница между Math.log1p(x) и Math.log(x) + 1. Это математически разные выражения.
console.log(Math.log1p(1) === Math.log(1) + 1);
false
История изменений
Функция Math.log1p() была стандартизирована в спецификации ECMAScript 2015 (ES6). С момента добавления в стандарт её поведение и сигнатура не претерпевали изменений. В более ранних версиях JavaScript, например ES5, эта функция отсутствует, что может привести к ошибкам в устаревших средах выполнения.
Расширенные примеры применения
Использование в финансовых расчетах для вычисления непрерывно начисляемого процента при малых ставках.
// Непрерывное наращение с очень малой ставкой
let tinyRate = 0.0005; // 0.05%
let time = 2;
let futureValue = 100 * Math.exp(Math.log1p(tinyRate) * time);
console.log(futureValue);
100.10001250052086
Вычисление логарифмической разности для относительных изменений, когда изменения малы.
function logChange(startValue, endValue) {
return Math.log1p((endValue - startValue) / startValue);
}
console.log(logChange(100, 100.1)); // Изменение на 0.1%
0.0009995003330834332
Применение в статистике для преобразования данных, содержащих нули, так как логарифм от нуля не определен, а log1p(0) дает 0.
let dataWithZeros = [0, 0.5, 1, 2];
let transformedData = dataWithZeros.map(Math.log1p);
console.log(transformedData);
[0, 0.4054651081081644, 0.6931471805599453, 1.0986122886681098]
Использование совместно с Math.expm1 для точного вычисления выражений вида ln((1+a)/(1+b)).
let a = 1e-10;
let b = 2e-10;
let preciseLogRatio = Math.log1p(a) - Math.log1p(b);
console.log(preciseLogRatio);
-9.999999995000001e-11