Expm1: примеры (PHP)
expm1(float $num): floatФункция expm1 в PHP
Функция expm1() вычисляет значение выражения ex - 1, где e – основание натурального логарифма (число Эйлера), а x – переданный аргумент. Этот метод предоставляет высокую точность для результатов, близких к нулю, что делает его особенно полезным в научных и финансовых расчетах.
Основное применение функции – вычисления, где требуется повышенная точность при работе с малыми значениями аргумента. Прямое вычисление exp(x) - 1 для очень маленьких x может привести к потере значащих цифр из-за особенностей представления чисел с плавающей запятой. expm1() решает эту проблему, используя специализированные алгоритмы.
Функция принимает один обязательный параметр:
- $x (
float) – показатель степени, в которую возводится числоe.
Возвращаемое значение всегда имеет тип float.
Примеры использования
Вычисление для положительных и отрицательных чисел:
echo expm1(1);1.718281828459
echo expm1(-0.5);-0.393469340287
Сравнение точности с обычным вычислением:
$x = 1e-8;
echo 'expm1: ' . expm1($x) . "\n";
echo 'exp-1: ' . (exp($x) - 1);expm1: 1.000000005e-8 exp-1: 1.0000000065512e-8
echo expm1(0);0
echo expm1(INF);INF
Похожие функции в PHP
- exp() – вычисляет
ex. Используется, когда не требуется повышенная точность для малых значений. - pow() и оператор
**– позволяют возводить в произвольную степень, но не оптимизированы для вычисленияex - 1. - log1p() – обратная операция, вычисляет
log(1 + x)с высокой точностью для малыхx.
Выбор между exp() и expm1() зависит от требуемой точности и диапазона входных значений.
Аналоги в других языках
Expm1 в Python
import math
print(math.expm1(1e-10))1.00000000005e-10
Expm1 в Javascript
console.log(Math.expm1(0.1));0.10517091807564763
Expm1 в MySQL
SELECT EXP(0.01) - 1;0.010050167084168
В Python и JavaScript функции имеют такое же название и аналогичное назначение. В MySQL прямой аналогии нет, используется комбинация EXP() - 1.
Типичные ошибки
echo expm1('текст');В PHP 8+: TypeError: expm1(): Argument #1 ($num) must be of type float, string given
$large = 1e10;
echo expm1($large);INF
При превышении пределов чисел двойной точности функция возвращает бесконечность.
Изменения в PHP 8
В PHP 8.0 функция стала строго типизированной. Аргумент теперь должен быть типа float, int или типа, который можно преобразовать в число. Передача нечисловых значений вызывает TypeError. В предыдущих версиях такие аргументы преобразовывались с предупреждениями.
Расширенные примеры
function sinh1($x) {
return (expm1($x) + expm1(-$x)) / 2;
}
echo sinh1(0.5);0.521095305494
$principal = 1000;
$rate = 0.05;
$time = 2;
$futureValue = $principal * expm1($rate * $time) + $principal;
echo $futureValue;1105.1709180756
// Логарифмирование произведения вероятностей
$probabilities = [0.999999, 0.999998];
$logSum = array_sum(array_map('log1p', array_map(function($p) {
return $p - 1;
}, $probabilities)));
$original = expm1($logSum) + 1;
echo $original;0.999997000001
// Вычисление суммы ряда с использованием expm1 для малых шагов
$sum = 0;
for ($i = 0; $i < 1000; $i++) {
$sum += expm1($i * 0.0001);
}
echo $sum;51.70927106499