expm1()
Функция expm1() в PHP возвращает e в степени числа минус 1 с полной точностью даже для малых значений аргумента.
Функция PHP expm1() возвращает e в степени числа минус 1, то есть exp(x) - 1. Её ценность состоит в вычислении этого результата точно при малых значениях x, где наивное выражение exp($x) - 1 теряет точность. На этой странице объясняется, что делает expm1(), её синтаксис, когда следует использовать её вместо exp() и какую проблему она решает.
Синтаксис
expm1(float $num): float| Параметр | Описание |
|---|---|
$num | Обязательный. Показатель степени. Любое число — положительное, отрицательное или ноль. Значения, не являющиеся числами с плавающей точкой, приводятся к типу float. |
Возвращаемое значение: e в степени $num минус 1 в виде значения типа float. Здесь e — число Эйлера (≈ 2.718281828).
Простой пример
Поскольку e^2 ≈ 7.389056, вычитание 1 даёт результат:
6.3890560989307(По умолчанию PHP выводит 14 значащих цифр; это определяется директивой precision в INI-настройках.)
Почему бы просто не написать exp($x) - 1?
В большинстве случаев expm1($x) и exp($x) - 1 дают одинаковый результат. Разница проявляется, когда $x очень близко к нулю.
При малых значениях $x результат exp($x) очень близок к 1, поэтому exp($x) - 1 вычитает два почти равных числа с плавающей точкой. Большинство значащих цифр при этом уничтожается — явление, известное как катастрофическая потеря значимости — и результат оказывается значительно менее точным. Функция expm1() реализована так, чтобы вычислять e^x - 1 напрямую, сохраняя полную точность:
<?php
$x = 1e-15;
echo exp($x) - 1; // imprecise: digits cancel
echo "\n";
echo expm1($x); // accurate
?>Наивное вычитание возвращает примерно 1.1102230246252E-15, тогда как expm1() возвращает 1.0E-15 — правильное значение. Всякий раз, когда вы вычисляете проценты, затухание или рост за очень малые промежутки времени, expm1() является безопасным выбором.
Отрицательные аргументы и ноль
expm1() принимает полный диапазон вещественных чисел:
<?php
echo expm1(0); // e^0 - 1 = 0
echo "\n";
echo expm1(-1); // 1/e - 1, a negative result
?>Это выводит:
0
-0.63212055882856Обратите внимание, что expm1(0) равно точно 0, а отрицательные аргументы дают результаты в диапазоне от -1 до 0.
Когда использовать expm1()
- Финансовые расчёты, где ставки невелики (например, преобразование годовой ставки в секундную).
- Модели непрерывного роста или затухания, вычисляемые на малых интервалах.
- Любая формула вида
e^x - 1, гдеxможет стремиться к нулю.
Для обратного направления — точного вычисления log(1 + x) при малых значениях x — используйте функцию-компаньон log1p(). Для обычного возведения в степень без вычитания -1 используйте exp().
Заключение
expm1() вычисляет e^x - 1 с полной точностью чисел с плавающей точкой, даже когда x близко к нулю, где exp($x) - 1 потеряло бы точность. Используйте её в научных и финансовых вычислениях с малыми показателями степени; во всех остальных случаях достаточно exp(). Смотрите также обратную функцию log1p().