
In Python, il tipo di numero a virgola mobile float è una rappresentazione a 64 bit di un numero a virgola mobile a precisione doppia, equivalente a double in altri linguaggi di programmazione come C.
Questo articolo spiega come ottenere e controllare l’intervallo (valori massimo e minimo) che float può rappresentare in Python.
In molti ambienti, la gamma è la seguente.
-1.7976931348623157e+308 <= f <= 1.7976931348623157e+308
In questo articolo vengono descritti i seguenti contenuti.
- float è un numero a virgola mobile a precisione doppia in Python
- Informazioni sul funzionamento:
sys.float_info
- Il valore massimo che può rappresentare:
sys.float_info.max
- Il valore minimo che può rappresentare
- Il valore minimo negativo
- Il valore normalizzato positivo minimo:
sys.float_info.min
- Il valore denormalizzato positivo minimo
Nota che non c’è limite per il tipo intero int in Python3.
Il tipo float ha anche un valore speciale, inf, che rappresenta l’infinito.
float è un numero a virgola mobile a precisione doppia in Python
In Python, i numeri vengono generalmente implementati utilizzando il linguaggio C double, come nella documentazione ufficiale.
I numeri in virgola mobile sono generalmente implementati usando double in C;
Tipi incorporati: documentazione di Python 3.9.7
A meno che non utilizzi un’implementazione speciale che non sia CPython, puoi presumere che venga utilizzato double. Puoi verificare la precisione utilizzando sys.float_info di seguito.
Il numero a virgola mobile a precisione doppia doppia è una rappresentazione di numeri a virgola mobile a 64 bit.
In molti altri linguaggi di programmazione, come C, i numeri a virgola mobile a precisione singola sono usati come float ei numeri a virgola mobile a precisione doppia come double, ma in Python la doppia precisione è chiamata float e non esiste un tipo a precisione singola .
Si noti che è possibile specificare in NumPy il tipo con il numero, ad esempio float32, float64.
Informazioni sul funzionamento:sys.float_info
Usa sys.float_info per ottenere informazioni su float.
Il modulo sys è incluso nella libreria standard, quindi non è richiesta alcuna installazione aggiuntiva.
import sys
print(sys.float_info)
# sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
print(type(sys.float_info))
# <class 'sys.float_info'>
Puoi ottenere il valore di ogni elemento come attributo, come sys.float_info..
print(sys.float_info.max)
# 1.7976931348623157e+308
Consulta la documentazione ufficiale per un elenco di elementi e le relative informazioni. Ciascun elemento corrisponde a una costante in virgola mobile definita nel file di intestazione standard float.h del linguaggio C.
attributo | macro float.h | spiegazione |
---|---|---|
epsilon | DBL_EPSILON | differenza tra 1,0 e il valore minimo maggiore di 1,0 rappresentabile come float |
scavare | DBL_DIG | numero massimo di cifre decimali che possono essere rappresentate fedelmente in un float |
mant_dig | DBL_MANT_DIG | float precision: il numero di cifre in base alla radice nel significato di un float |
max | DBL_MAX | float finito positivo massimo rappresentabile |
max_exp | DBL_MAX_EXP | numero intero massimo e tale che radix**(e-1) sia un float finito rappresentabile |
max_10_exp | DBL_MAX_10_EXP | numero intero massimo e racconto che 10**e sia nell’intervallo dei float finiti rappresentabili |
min | DBL_MIN | galleggiante normalizzato positivo minimo rappresentabile |
min_exp | DBL_MIN_EXP | numero intero minimo e tale che radix**(e-1) sia un float normalizzato |
min_10_exp | DBL_MIN_10_EXP | numero intero minimo e tale che 10**e sia un float normalizzato |
radice | FLT_RADIX | radice di rappresentazione dell’esponente |
torni | FLT_ROUNDS | costante intera che rappresenta la modalità di arrotondamento utilizzata per le operazioni aritmetiche. Ciò riflette il valore della macro FLT_ROUNDS di sistema all’avvio dell’interprete |
Il valore massimo che può rappresentare:sys.float_info.max
Puoi ottenere il valore massimo che float può rappresentare con sys.float_info.max. e+XXX significa 10 alla potenza di XXX. + è facoltativo.
print(sys.float_info.max)
# 1.7976931348623157e+308
I valori che superano questo valore vengono trattati come inf, che significa infinito. Vedere il seguente articolo per i dettagli su inf.
print(1.8e+308)
# inf
print(type(1.8e+308))
# <class 'float'>
In esadecimale, è il seguente.
print(sys.float_info.max.hex())
# 0x1.fffffffffffffp+1023
Il valore minimo che può rappresentare
Il valore minimo negativo
Il valore negativo minimo che può rappresentare è sys.float_info.max con -. I valori inferiori a questo vengono trattati come infinito negativo.
print(-sys.float_info.max)
# -1.7976931348623157e+308
print(-1.8e+308)
# -inf
print(type(-1.8e+308))
# <class 'float'>
Il valore normalizzato positivo minimo:sys.float_info.min
È possibile ottenere il valore normalizzato positivo minimo con sys.float_info.min.
print(sys.float_info.min)
# 2.2250738585072014e-308
Un numero normalizzato è un valore la cui parte esponente non è 0. sys.float_info.min è come segue in esadecimale.
print(sys.float_info.min.hex())
# 0x1.0000000000000p-1022
Il valore denormalizzato positivo minimo
sys.float_info.min è il valore normalizzato positivo minimo.
I valori che la loro parte esponente è 0 e la loro parte mantissa non è 0 sono chiamati numeri denormalizzati.
Il valore minimo positivo denormalizzato può essere convertito da una stringa esadecimale come segue:
print(float.fromhex('0x0.0000000000001p-1022'))
# 5e-324
print(format(float.fromhex('0x0.0000000000001p-1022'), '.17'))
# 4.9406564584124654e-324
Un valore inferiore a questo è considerato 0,0.
print(1e-323)
# 1e-323
print(1e-324)
# 0.0
In Python 3.9 o versioni successive, puoi ottenere il valore denormalizzato positivo minimo passando 0.0 alla funzione math.ulp() appena aggiunta.
import math
print(math.ulp(0.0))
# 5e-324
print(format(math.ulp(0.0), '.17'))
# 4.9406564584124654e-324