W3docs

expm1()

Scopri la funzione expm1() in PHP: calcola il valore esponenziale di un numero meno 1 con piena precisione floating-point.

La funzione PHP expm1() restituisce e elevato alla potenza di un numero, meno 1 — ovvero exp(x) - 1. Il suo valore sta nel calcolare questo risultato con precisione per x piccoli, dove la formula ingenua exp($x) - 1 perde precisione. Questa pagina spiega cosa fa expm1(), la sua sintassi, quando usarla al posto di exp() e il problema che è stata creata per risolvere.

Sintassi

expm1(float $num): float
ParametroDescrizione
$numObbligatorio. L'esponente. Qualsiasi numero — positivo, negativo o zero. I valori non float vengono convertiti in float.

Valore restituito: e elevato alla potenza di $num, meno 1, come float. Qui e è il numero di Eulero (≈ 2.718281828).

Esempio base

php— editable, runs on the server

Poiché e^2 ≈ 7.389056, sottraendo 1 si ottiene il risultato:

6.3890560989307

(PHP stampa 14 cifre significative per impostazione predefinita, controllate dall'impostazione INI precision.)

Perché non scrivere semplicemente exp($x) - 1?

Per la maggior parte degli input, expm1($x) e exp($x) - 1 danno la stessa risposta. La differenza emerge quando $x è molto vicino a zero.

Quando $x è molto piccolo, exp($x) è molto vicino a 1, quindi exp($x) - 1 sottrae due numeri in virgola mobile quasi uguali. La maggior parte delle cifre significative si annulla — un problema noto come cancellazione catastrofica — e il risultato è molto meno preciso. expm1() è implementata per calcolare e^x - 1 direttamente, mantenendo la piena precisione:

<?php
$x = 1e-15;

echo exp($x) - 1; // imprecise: digits cancel
echo "\n";
echo expm1($x);   // accurate
?>

La sottrazione ingenua restituisce circa 1.1102230246252E-15, mentre expm1() restituisce 1.0E-15, che è il valore corretto. Ogni volta che si calcolano interessi composti, decadimento o crescita su intervalli di tempo molto piccoli, expm1() è la scelta sicura.

Argomenti negativi e zero

expm1() accetta l'intero intervallo dei numeri reali:

<?php
echo expm1(0);   // e^0 - 1 = 0
echo "\n";
echo expm1(-1);  // 1/e - 1, a negative result
?>

L'output è:

0
-0.63212055882856

Si noti che expm1(0) è esattamente 0, e gli argomenti negativi producono risultati compresi tra -1 e 0.

Quando usare expm1()

  • Matematica finanziaria in cui i tassi sono piccoli (ad es. conversione di un tasso annuale in un tasso al secondo).
  • Modelli di crescita o decadimento continuo valutati su intervalli molto piccoli.
  • Qualsiasi formula della forma e^x - 1 in cui x può avvicinarsi a zero.

Per la direzione inversa — calcolare log(1 + x) con precisione per x piccoli — usare la funzione complementare log1p(). Per l'esponenziazione ordinaria senza il -1, usare exp().

Conclusione

expm1() calcola e^x - 1 con piena precisione in virgola mobile, anche quando x è vicino a zero, dove exp($x) - 1 perderebbe accuratezza. Usatela nei calcoli scientifici e finanziari che coinvolgono esponenti piccoli; per tutto il resto, exp() è sufficiente. Si veda anche la sua inversa, log1p().

Pratica

Pratica
Cosa è vero riguardo alla funzione expm1 in PHP?
Cosa è vero riguardo alla funzione expm1 in PHP?
Was this page helpful?