HOWTO · Python

Usare il numero di Eulero in Python

Usa correttamente math.e, math.exp() e numpy.exp() per il numero di Eulero in Python.

In questa pagina

Usa math.e quando ti serve il valore in virgola mobile del numero di Eulero, math.exp(x) quando devi elevare e a un esponente scalare e numpy.exp(values) quando devi eseguire il calcolo su ogni elemento di un array. Il modulo math fa parte della libreria standard di Python; NumPy è una dipendenza facoltativa per lavorare con gli array. La scelta dipende dalla forma e dallo scopo dell’input, non da una classifica universale della velocità.

Il numero di Eulero, solitamente scritto come e, è la base dei logaritmi naturali. Python lo memorizza come valore binario in virgola mobile, quindi la formattazione della stampa può cambiarne l’aspetto senza cambiare il valore usato nei calcoli successivi.

Leggere math.e per ottenere la costante

Importa e da math per leggere direttamente la costante. È utile per etichette, formule o calcoli che richiedono esplicitamente il valore della base. L’output è la normale rappresentazione di un float Python nell’ambiente testato.

from math import e

print(e)
2.718281828459045

Usa la formattazione solo al momento della presentazione. Ad esempio, f"{e:.5f}" visualizza 2.71828, ma non rende più preciso il float memorizzato. Conserva il valore non formattato durante i calcoli e arrotondalo solo quando un lettore, un file o un’interfaccia richiede un numero specifico di decimali.

Usare math.exp() per un esponente scalare

Per uno scalare x, usa math.exp(x) per calcolare e elevato a x. L’operazione è esplicita e la documentazione Python la indica generalmente come più precisa di math.e ** x. math.expm1(x) è la funzione adatta all’espressione exp(x) - 1 e impedisce di perdere cifre significative quando x è molto vicino a zero.

import math

print(math.exp(3))
print(math.expm1(1e-16))
20.085536923187668
1e-16

La prima riga calcola e al cubo. La seconda mostra il piccolo risultato prodotto da expm1; sottrarre 1 da math.exp(1e-16) può arrotondare via informazioni prima che la sottrazione sia completata.

math.exp() è limitato dall’intervallo dei float di Python. Un esponente finito abbastanza grande genera OverflowError; gestisci questo limite quando l’input può essere illimitato, invece di supporre che ogni esponente abbia un risultato rappresentabile.

import math

try:
    math.exp(1000)
except OverflowError as error:
    print(type(error).__name__)
OverflowError

Se un’applicazione prevede un overflow, verifica l’intervallo dell’input, cambia la rappresentazione matematica o usa un metodo numerico adatto al dominio. Catturare l’eccezione è utile quando fa parte del comportamento previsto, ma non deve nascondere un errore di input imprevisto.

Usare numpy.exp() per i valori di un array

numpy.exp() è una funzione universale applicata elemento per elemento. Passale una raccolta simile a un array quando ogni esponente richiede il proprio risultato. Installa NumPy con il normale strumento per le dipendenze del progetto se non è già disponibile; il modulo math della libreria standard non offre operazioni sugli array.

import numpy as np

exponents = np.array([0.0, 1.0, 2.0])
print(np.exp(exponents))
[1.         2.71828183 7.3890561 ]

L’array restituito ha la stessa forma dell’input e contiene e elevato a ciascun elemento. Usa math.exp() per uno scalare e numpy.exp() quando servono semantiche da array; NumPy accetta anche uno scalare, ma importarlo solo per un calcolo scalare non è necessario.

Scegliere il metodo in base all’input

Usa math.e per leggere la costante, math.exp() per un esponente scalare e numpy.exp() per i calcoli elemento per elemento sugli array. Usa math.expm1() quando il risultato richiesto è exp(x) - 1 vicino a zero. Ricorda che queste API usano valori finiti in virgola mobile: la formattazione cambia la visualizzazione e risultati esponenziali molto grandi potrebbero non entrare in un float. Consulta la documentazione ufficiale di Python per math e la documentazione NumPy di exp.