2013-07-19 19 views

risposta

7

float f = (float)numeric_limits<double>::infinity();

Questo è garantito per impostare f all'infinito se la vostra piattaforma di compilation offre IEEE 754 aritmetica per i calcoli in virgola mobile (di solito lo fa).

Oppure, provate a lanciare qualcosa di più grande del float max in un float, sono sicuro di finire all'infinito?

No. Nella predefinito IEEE 754 round-a-nearest mode, alcuni valori double superiori al massimo finita float (cioè, FLT_MAX) convertire in FLT_MAX. Il limite esatto è il numero a metà tra FLT_MAX (0x1.fffffep127 in rappresentazione esadecimale C99) e il numero successivo float che potrebbe essere rappresentato se l'esponente nel formato a precisione singola avesse un intervallo più ampio, 0x2.0p128. Il limite è quindi 0x1.ffffffp127 o circa 3.4028235677973366e + 38 in decimale.

+1

In modalità round to to-close con aritmetica IEEE 754 (che sono comuni). –

+3

Nel linguaggio di questa risposta, un "piccolo" è 536 milioni, 870 mila, 911. –

6

Dalla standard C++ 11, §4.8.1:

Un prvalue di tipo a virgola mobile può essere convertito in un prvalue di altro tipo virgola mobile. Se il valore di origine può essere esattamente rappresentato nel tipo di destinazione, il risultato della conversione è quella rappresentazione esatta. 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. Altrimenti, il comportamento non è definito.

Ciò implica che

  • Se lanci doppio infinito a galleggiare, si ottiene galleggiante infinito.

  • Se lanci un doppio valore, che si trova tra il float massimo e l'infinito, il float, allora ottieni il float massimo o il float infinito.

+1

La prima parte della domanda riguarda l'infinito, che può essere esattamente rappresentato nel tipo di destinazione, no? –

+0

@Pascal Cuoq: ho modificato la risposta. – user763305

+1

@ user763305 Questa è un'interpretazione interessante; Non ci avevo mai pensato, ma hai ragione: i valori superiori a 'FLT_MAX' sono compresi tra' FLT_MAX' e 'Inf', quindi il comportamento è ben definito dallo standard. (Anche se non lo fosse, naturalmente, è definito da IEEE.) –