Domanda

Sto scrivendo un pezzo di codice in cui devo convertire da valori double to float.Sto usando boost :: numeric_cast per fare questa conversione che mi avviserà di qualsiasi troppopieno / underflow.Comunque sono anche interessato a sapere se quella conversione ha portato a una perdita di precisione o meno.

Ad esempio

    double source =  1988.1012;
    float dest = numeric_cast<float>(source);
.

Produce DES che ha valore 1988.1

C'è qualche modo disponibile in cui posso rilevare questo tipo di perdita di precisione / arrotondamento

È stato utile?

Soluzione

Si potrebbe lanciare il galleggiante a un doppio e confrontare questo doppio fino all'originale - che dovrebbe darti un'indicazione giusta sul fatto che ci fosse una perdita di precisione.

Altri suggerimenti

float dest = numeric_cast<float>(source);
double residual = source - numeric_cast<double>(dest);
.

Quindi, residual contiene la "perdita" che stai cercando.

Guarda questi articoli per singola precisione e doppia precisione galleggias. Prima di tutto, i galleggianti hanno 8 bit per l'esponente vs 11 per un doppio. Quindi qualsiasi cosa più grande di 10 ^ 127 o più piccola di 10 ^ -126 in magnitudine sarà il trabocco di cui hai menzionato. Per il galleggiante, hai 23 bit per le cifre effettive del numero, VS 52 bit per il doppio. Quindi, ovviamente, hai molte più cifre di precisione per il doppio del galleggiante.

Dì che hai un numero come: 1.1123. Questo numero potrebbe non essere effettivamente codificato come 1.1123 perché le cifre in un numero di virgola mobile vengono utilizzate per adattarsi effettivamente come frazioni. Ad esempio, se i tuoi bit nella mantissa erano 11001, il valore sarebbe formato da 1 (implicito) + 1 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 * 1/32 + 0 * (64 + 128 + ...). Quindi il valore esatto non può essere codificato a meno che non si possa aggiungere queste frazioni in modo tale che sia il numero esatto. Questo è raro. Pertanto, ci sarà quasi sempre una perdita di precisione.

Avrai un certo livello di perdita di precisione, come da risposta di Dave.Se, tuttavia, si desidera concentrarsi sulla quantificarla e alzare un'eccezione quando supera un certo numero, dovrai aprire il numero del punto flottante stesso e analizzare la mantissa ed esponente, quindi fare qualche analisi per determinare se tu "VE ha superato la tua tolleranza.

Ma, la buona notizia, i suoi di solito il galleggiante del punto flottante standard IEEE.: -)

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