Precisione dei numeri a virgola mobile

Stai visualizzando una vecchia versione di questo article. Visualizza la versione più recente.

Per loro natura, non tutti i numeri a virgola mobile possono essere registrati con la massima precisione. L'architettura hardware, la CPU e perfino il livello di ottimizzazione e la versione del compilatore possono influenzare la precisione.

Se si comparano numeri DOUBLE o FLOAT che hanno una parte decimale, l'operatore di eguaglianza non è affidabile.

A volte, il problema si può risolvere modificando il tipo di dato da precisione singola (FLOAT) a precisione doppia (DOUBLE).

Esempi

f1, f2 e f3 apparentemente hanno lo stesso valore all'interno della stessa riga, ma a causa della precisione dei numeri a virgola mobile, il risultato potrebbe essere inaspettato.

CREATE TABLE fpn (id INT, f1 FLOAT, f2 DOUBLE, f3 DECIMAL (10,3));
INSERT INTO fpn VALUES (1,2,2,2),(2,0.1,0.1,0.1);

SELECT * FROM fpn WHERE f1*f1 = f2*f2;
+------+------+------+-------+
| id   | f1   | f2   | f3    |
+------+------+------+-------+
|    1 |    2 |    2 | 2.000 |
+------+------+------+-------+

Il motivo per cui una sola delle due righe viene restituita diviene chiaro se si esamina il risultato dei quadrati dei numeri a virgola mobile.

SELECT f1*f1, f2*f2, f3*f3 FROM fpn;
+----------------------+----------------------+----------+
| f1*f1                | f2*f2                | f3*f3    |
+----------------------+----------------------+----------+
|                    4 |                    4 | 4.000000 |
| 0.010000000298023226 | 0.010000000000000002 | 0.010000 |
+----------------------+----------------------+----------+

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.