Stałe zmiennoprzecinkowe mają domyślnie typ double
w C++. Ponieważ long double
jest bardziej precyzyjny niż double
, możesz utracić znaczące cyfry, gdy stałe long double
są konwertowane na double
. Aby obsłużyć te stałe, należy użyć przyrostka L
, aby zachować dokładność long double
. Na przykład,
long double x = 8.99999999999999999;
long double y = 8.99999999999999999L;
std::cout.precision(100);
std::cout << "x=" << x << "\n";
std::cout << "y=" << y << "\n";
Wyjście dla tego kodu w systemie, gdzie double
wynosi 64 bity i long double
96, jest
x=9
y=8.9999999999999999895916591441391574335284531116485595703125
Co tu się dzieje jest to, że x
zostanie zaokrąglona przed przypisaniem, ponieważ stała jest niejawnie przekształcana na double
, a 8.99999999999999999
nie jest reprezentowana jako liczba zmiennoprzecinkowa 64-bitowa. (Zauważ, że reprezentacja jako long double
nie jest w pełni precyzyjne albo. Wszystkie cyfry po pierwszym ciągiem 9
s są próbą przybliżenia liczbę dziesiętną 8.99999999999999999
tak blisko jak to możliwe przy użyciu 96 bitów binarnych.)
w twojej Na przykład nie ma potrzeby stałej L
, ponieważ 3.0
można dokładnie przedstawić jako double
lub long double
. Stała wartość double
jest niejawnie przekształcana na long double
bez utraty dokładności.
Sprawa z F
nie jest tak oczywista. Może pomóc w przeciążeniu, jak zauważa Zan Lynx. Nie jestem pewien, ale może też uniknąć pewnych subtelnych błędów zaokrąglania (tzn. Jest możliwe, że kodowanie jako float
da inny wynik z kodowania jako double
, a następnie zaokrąglenie do float
).
C++ Najczęściej zadawane pytania: [Jaki jest sens końcówek literałów numerycznych?] (Http://www.parashift.com/c++-faq-lite/numeric-literal-suffixes.html) – legends2k
Możliwy duplikat [co to jest powód do jawnego deklarowania L lub UL dla długich wartości] (https://stackoverflow.com/questions/13134956/what-is-the-reason-for-exicicitly-declaring-l-or-ul-for-long-values) –