W3docs

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âmetroDescrição
$numObrigató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

php— editable, runs on the server

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

Observe 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 - 1 onde x pode 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().

Prática

Prática
O que é verdadeiro sobre a função expm1 no PHP?
O que é verdadeiro sobre a função expm1 no PHP?
Was this page helpful?