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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top