W3docs

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).

Простой пример

php— editable, runs on the server

Поскольку 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().

Практика

Практика
Что верно в отношении функции expm1 в PHP?
Что верно в отношении функции expm1 в PHP?
Was this page helpful?