Le costanti a virgola mobile hanno tipo double
per impostazione predefinita in C++. Poiché uno long double
è più preciso di uno double
, è possibile perdere cifre significative quando le costanti long double
vengono convertite in double
. Per gestire queste costanti, è necessario utilizzare il suffisso L
per mantenere la precisione long double
. Ad esempio,
long double x = 8.99999999999999999;
long double y = 8.99999999999999999L;
std::cout.precision(100);
std::cout << "x=" << x << "\n";
std::cout << "y=" << y << "\n";
L'uscita per questo codice sul mio sistema, dove double
è di 64 bit e long double
96, è
x=9
y=8.9999999999999999895916591441391574335284531116485595703125
Quello che sta succedendo qui è che x
ottiene arrotondato prima della cessione, in quanto il la costante viene convertita implicitamente in double
e 8.99999999999999999
non è rappresentabile come numero in virgola mobile a 64 bit. (Si noti che la rappresentazione come long double
non è completamente precisa sia. Tutte le cifre dopo la prima stringa di 9
s sono un tentativo di approssimare il numero decimale 8.99999999999999999
più fedelmente possibile utilizzando 96 bit binari.)
Nel Ad esempio, non è necessaria la costante L
, poiché 3.0
è rappresentabile esattamente come double
o long double
. Il valore costante double
viene convertito implicitamente in long double
senza alcuna perdita di precisione.
Il caso con F
non è così ovvio. Può aiutare con il sovraccarico, come sottolinea Zan Lynx. Non sono sicuro, ma potrebbe anche evitare alcuni sottili errori di arrotondamento (ad esempio, è possibile che la codifica come float
fornisca un risultato diverso dalla codifica come double
, quindi arrotondando a float
).
fonte
2009-09-04 23:13:29
C++ Domande frequenti: [Qual è il punto di suffissi su letterali numerici?] (Http://www.parashift.com/c++-faq-lite/numeric-literal-suffixes.html) – legends2k
Possibile duplicato di [qual è il motivo per dichiarare esplicitamente L o UL per valori lunghi] (https://stackoverflow.com/questions/13134956/what-is-the-reason-for-explicitly-declaring-l-or-ul-for-long-values) –