2015-03-23 3 views
6

assuma nel codice seguenteFa la conversione di un float ad un doppio e di nuovo a galleggiare dare lo stesso valore in C++

float f1 = ...; 
double d1 = static_cast<double>(f1); 
float f2 = static_cast<float>(d1); 

ASSERT(f1 == f2); 

la variabile f1 viene inizializzato a qualcosa che non è un NaN. L'affermazione è quindi garantita dallo standard C++?

+5

Non per NaN ... – Mysticial

+0

E in caso contrario? Perché non per i NaN? –

+4

I NaN non sono mai uguali. E penso che la risposta sia altrimenti dipendente dall'implementazione. –

risposta

4

Ecco alcuni indizi ma non la risposta:

4,6 A prvalue di tipo galleggiante può essere convertito in un prvalue di tipo double. Il valore è invariato. Questa conversione è chiamata promozione in virgola mobile. ...

4.8 Un valore di tipo a virgola mobile può essere convertito in un valore di un altro tipo a virgola mobile. Se il valore di origine può essere rappresentato esattamente nel tipo di destinazione, il risultato della conversione è esattamente la rappresentazione di . Se il valore di origine è compreso tra due valori di destinazione adiacenti, il risultato della conversione è una scelta definita dall'implementazione di uno di questi valori.

+0

In realtà, questo risponde, se si presuppone l'aritmetica IEEE754 (cioè 'is_iec559' è vero), poiché ogni binary32 (' float') può essere rappresentato esattamente come binary64 ('double'), escludendo il problema che' NaN! = NaN', naturalmente. –

+0

Sarebbe bene dare la fonte delle citazioni. – hyde

+6

Per completezza, 3.9.1/8: "L'insieme di valori del tipo' float' è un sottoinsieme dell'insieme di valori del tipo 'double'". Quindi non c'è bisogno di assumere qualcosa al di là di un'implementazione conforme. –

Problemi correlati