2015-03-23 16 views
6

Przyjmijmy w poniższym kodzieCzy konwersja float na podwójne i powrót do pływaka dać taką samą wartość w C++

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

ASSERT(f1 == f2); 

zmienna f1 jest inicjowany do czegoś, co nie jest NaN. Czy zapewnienie jest wtedy gwarantowane przez standard C++?

+5

Nie dla NaNs ... – Mysticial

+0

A poza tym? Dlaczego nie na NaNs? –

+4

NaN nigdy nie są równe. I myślę, że odpowiedź jest zależna od implementacji. –

Odpowiedz

4

Oto kilka wskazówek, ale nie odpowiedź:

4,6 prvalue typu float może być przekształcony w prvalue typu podwójnego. Wartość nie ulega zmianie. Ta konwersja nazywana jest zmiennoprzecinkową promocją. ...

4.8 Wartość progowa typu zmiennoprzecinkowego może zostać przekonwertowana na wartość innego typu zmiennoprzecinkowego. Jeśli wartość źródłowa może być dokładnie reprezentowana w docelowym typie, wynikiem konwersji jest dokładna reprezentacja . Jeśli wartość źródłowa znajduje się między dwiema sąsiednimi wartościami docelowymi, wynikiem konwersji jest zdefiniowana przez implementację wybór jednej z tych wartości.

+0

Właściwie to na nie odpowiada, jeśli założysz arytmetykę IEEE754 (tj. 'Is_iec559' jest prawdziwe), ponieważ każdy binary32 (' float') może być dokładnie odwzorowany jako binary64 ('double'), z wyłączeniem problemu, który' NaN! = NaN', oczywiście. –

+0

Dobrze byłoby podać źródło cytatów. – hyde

+6

Dla kompletności, 3.9.1/8: "Zbiór wartości typu' float' jest podzbiorem zestawu wartości typu 'double'". Nie ma więc potrzeby zakładać niczego poza zgodną implementacją. –

Powiązane problemy