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| Parametro | Descrizione |
|---|---|
$num | Obbligatorio. 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
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.63212055882856Si 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 - 1in cuixpuò 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().