C'è una cosa come "promozione in virgola mobile" di float
per double
per [conv.fpprom].
Un prvalue di tipo float
può essere convertito in un prvalue di tipo double
. Il valore è invariato.
Questa conversione è denominata promozione in virgola mobile.
Le risposte alla domanda collegata sono corrette. Questa promozione non dovrebbe verificarsi automaticamente quando si aggiungono due float
poiché le normali conversioni aritmetiche non promuovono gli operandi in virgola mobile.
floating point promozione fa verifica quando passa un float
come operando ad un'ellisse, come in printf
.Ecco perché lo specificatore di formato %f
stampa uno float
o uno double
: se si passa uno float
, la funzione riceve effettivamente un double
, il risultato della promozione.
L'esistenza della promozione virgola mobile è anche importante per la risoluzione di sovraccarico, perché integrali promozioni e virgola mobile promozioni hanno rango migliore conversione implicito che integrali conversioni, virgola mobile conversioni, e galleggianti integrale conversioni.
Esempio 1:
void f(double);
void f(long double);
f(0.0f);
Ciò richiede void f(double)
in quanto la promozione in double
è meglio che la conversione a long double
. Al contrario, consideriamo questo esempio forse sorprendente 2:
void f(long double);
void f(int);
f(0.0f);
Questo è ambiguo. La conversione da float
a long double
non è migliore della conversione da float
a int
poiché non sono entrambe promozioni.
Esempio 3:
struct S {
operator float();
operator int();
};
double d = S();
Ciò richiede operator float
e quindi promuove la risultante float
valore double
per inizializzare d
.
leggi i commenti e le risposte vedrai che il libro di Bjarne è in errore. –
possibile duplicato di [promozione floating point: stroustrup vs compilatore - chi ha ragione?] (Http://stackoverflow.com/questions/17215484/floating-point-promotion-stroustrup-vs-compiler-who-is-right) –
@RichardHodges Ho letto i commenti. Anche se quel piccolo estratto è stato tolto dal libro, questo non mi dice se la promozione in virgola mobile è stata tolta dalla lingua. Non ho ancora idea di quando possa verificarsi la promozione floating point. – Bryan