Ampiando la precisione con il cast risultati in quante precisione?
-
21-12-2019 - |
Domanda
So che le conversioni di allargamento sono al sicuro in quanto risultano in nessuna perdita di dati, ma c'è un vero guadagno in precisione o è una rappresentazione più lunga con lo stesso numero di figure significative?
Ad esempio,
#include <iostream>
#include <iomanip>
int main()
{
float i = 0.012530f;
std::cout << std::setw(20) << std::setprecision(7) << i << std::endl;
double ii = (double)i;
std::cout << std::setw(20) << std::setprecision(15) << ii << std::endl;
double j = 0.012530;
std::cout << std::setw(20) << std::setprecision(15) << j << std::endl;
}
.
Produce l'output
0.01253
0.012529999949039
0.01253
.
Guardando le variabili nel debugger mostra che j
è arrotondato poiché il punto di galleggiamento non può rappresentare esattamente il numero originale, ma è ancora un'approssimazione più esatta del numero originale rispetto al ii
.
i = 0.012530000
ii = 0.012529999949038029
j = 0.012529999999999999
.
Perché il cast è meno esatto dell'assegnazione diretta?Posso contare solo su 8 cifre di esattezza se allarga la precisione di un galleggiante?
Soluzione
Sembra che la risposta alla tua domanda sia ovvia. Poiché double
tiene più precisione rispetto a float
, ottieni un valore più preciso se si assegna direttamente a un double
e perdono precisione se si passa attraverso un float
.
Quando si esegue float i = 0.012530f;
ottieni un float
che è il più vicino di 0.01253 come può ottenere un float
. A 7 cifre, sembrano 0.012530
.
Quando si esegue double j = 0.012530;
, ottieni un double
che è vicino a 0.01253 come un double
può ottenere.
Se si getta il float
a un double
, si ottiene un double
che è vicino a 0.01253 come float
può ottenere.
Non è possibile confrontare davvero il numero di numeri in diverse precisi per vedere quale è più vicino. Ad esempio, affermare che il numero corretto è 0,5 e hai due approssimazioni "0.5001" e "0,49". Chiaramente, il primo è meglio. Ma se visualizzi il primo con 5 cifre decimali "0.5001" e il secondo con una sola cifra decimale "0,5", il secondo sembra più vicino. La tua prima uscita ha questo tipo di precisione falsa e apparente a causa di mostrare poche cifre e arrotondamento fortunato.