expm1()
Aprende a usar la función expm1() en PHP para calcular el valor exponencial de un número menos 1 con precisión total.
La función PHP expm1() devuelve e elevado a la potencia de un número, menos 1 — es decir, exp(x) - 1. Su valor está en calcular este resultado con precisión para valores pequeños de x, donde la expresión ingenua exp($x) - 1 pierde precisión. Esta página explica qué hace expm1(), su sintaxis, cuándo usarla en lugar de exp() y el problema que existe para resolver.
Sintaxis
expm1(float $num): float| Parámetro | Descripción |
|---|---|
$num | Requerido. El exponente. Cualquier número — positivo, negativo o cero. Los valores no float se convierten a float. |
Valor de retorno: e elevado a la potencia de $num, menos 1, como un float. Aquí e es el número de Euler (≈ 2.718281828).
Ejemplo básico
Como e^2 ≈ 7.389056, restar 1 da el siguiente resultado:
6.3890560989307(PHP imprime 14 dígitos significativos por defecto, controlado por el ajuste INI precision.)
¿Por qué no escribir simplemente exp($x) - 1?
Para la mayoría de los valores, expm1($x) y exp($x) - 1 dan el mismo resultado. La diferencia aparece cuando $x está muy cerca de cero.
Cuando $x es muy pequeño, exp($x) es muy cercano a 1, por lo que exp($x) - 1 resta dos números de coma flotante casi iguales. La mayoría de los dígitos significativos se cancelan — un problema conocido como cancelación catastrófica — y el resultado es mucho menos preciso. expm1() está implementado para calcular e^x - 1 directamente, manteniendo la precisión total:
<?php
$x = 1e-15;
echo exp($x) - 1; // imprecise: digits cancel
echo "\n";
echo expm1($x); // accurate
?>La sustracción ingenua devuelve aproximadamente 1.1102230246252E-15, mientras que expm1() devuelve 1.0E-15, que es el valor correcto. Siempre que se calculen intereses compuestos, decaimiento o crecimiento en pasos de tiempo muy pequeños, expm1() es la opción segura.
Argumentos negativos y cero
expm1() acepta el rango completo de números reales:
<?php
echo expm1(0); // e^0 - 1 = 0
echo "\n";
echo expm1(-1); // 1/e - 1, a negative result
?>Esto muestra:
0
-0.63212055882856Nótese que expm1(0) es exactamente 0, y los argumentos negativos producen resultados entre -1 y 0.
Cuándo usar expm1()
- Matemáticas financieras donde las tasas son pequeñas (p. ej., convertir una tasa anual a una tasa por segundo).
- Modelos de crecimiento o decaimiento continuo evaluados en intervalos muy pequeños.
- Cualquier fórmula de la forma
e^x - 1dondexpuede aproximarse a cero.
Para la dirección inversa — calcular log(1 + x) con precisión para valores pequeños de x — usa la función complementaria log1p(). Para la exponenciación ordinaria sin el -1, usa exp().
Conclusión
expm1() calcula e^x - 1 con precisión total de coma flotante, incluso cuando x está cerca de cero, donde exp($x) - 1 perdería exactitud. Úsala en cálculos científicos y financieros con exponentes pequeños; para todo lo demás, exp() es suficiente. Consulta también su función inversa, log1p().