expm1()
Aprenda a usar a função expm1() no PHP para calcular o valor exponencial de um número menos 1 com precisão total.
A função PHP expm1() retorna e elevado à potência de um número, menos 1 — ou seja, exp(x) - 1. Seu valor está em calcular esse resultado com precisão para valores pequenos de x, onde o método ingênuo exp($x) - 1 perde precisão. Esta página explica o que expm1() faz, sua sintaxe, quando utilizá-la no lugar de exp() e o problema que ela existe para resolver.
Sintaxe
expm1(float $num): float| Parâmetro | Descrição |
|---|---|
$num | Obrigatório. O expoente. Qualquer número — positivo, negativo ou zero. Valores não float são convertidos para float. |
Valor de retorno: e elevado à potência de $num, menos 1, como um float. Aqui e é o número de Euler (≈ 2.718281828).
Exemplo básico
Como e^2 ≈ 7.389056, subtraindo 1 obtemos a saída:
6.3890560989307(PHP imprime 14 dígitos significativos por padrão, controlado pela configuração INI precision.)
Por que não simplesmente escrever exp($x) - 1?
Para a maioria das entradas, expm1($x) e exp($x) - 1 produzem o mesmo resultado. A diferença aparece quando $x é muito próximo de zero.
Quando $x é muito pequeno, exp($x) é muito próximo de 1, portanto exp($x) - 1 subtrai dois números de ponto flutuante quase iguais. A maioria dos dígitos significativos se cancela — problema conhecido como cancelamento catastrófico — e o resultado é muito menos preciso. expm1() é implementada para calcular e^x - 1 diretamente, mantendo precisão total:
<?php
$x = 1e-15;
echo exp($x) - 1; // imprecise: digits cancel
echo "\n";
echo expm1($x); // accurate
?>A subtração ingênua retorna aproximadamente 1.1102230246252E-15, enquanto expm1() retorna 1.0E-15, que é o valor correto. Sempre que você calcular juros compostos, decaimento ou crescimento em intervalos de tempo muito pequenos, expm1() é a escolha segura.
Argumentos negativos e zero
expm1() aceita toda a gama de números reais:
<?php
echo expm1(0); // e^0 - 1 = 0
echo "\n";
echo expm1(-1); // 1/e - 1, a negative result
?>Isso produz:
0
-0.63212055882856Observe que expm1(0) é exatamente 0, e argumentos negativos produzem resultados entre -1 e 0.
Quando usar expm1()
- Matemática financeira onde as taxas são pequenas (por exemplo, convertendo uma taxa anual para uma taxa por segundo).
- Modelos de crescimento ou decaimento contínuos avaliados em intervalos muito pequenos.
- Qualquer fórmula da forma
e^x - 1ondexpode se aproximar de zero.
Para a direção inversa — calcular log(1 + x) com precisão para valores pequenos de x — use a função complementar log1p(). Para exponenciação comum sem o -1, use exp().
Conclusão
expm1() calcula e^x - 1 com precisão total de ponto flutuante, mesmo quando x está próximo de zero, onde exp($x) - 1 perderia precisão. Utilize-a em cálculos científicos e financeiros envolvendo expoentes pequenos; para tudo o mais, exp() é suficiente. Veja também sua inversa, log1p().