Константы с плавающей запятой имеют тип double
по умолчанию в C++. Поскольку long double
более точен, чем double
, вы можете потерять значительные цифры, когда long double
константы преобразуются в double
. Чтобы обрабатывать эти константы, вам необходимо использовать суффикс L
для поддержания точности long double
. Например,
long double x = 8.99999999999999999;
long double y = 8.99999999999999999L;
std::cout.precision(100);
std::cout << "x=" << x << "\n";
std::cout << "y=" << y << "\n";
Выход для этого кода в моей системе, где double
составляет 64 бита и long double
96, является
x=9
y=8.9999999999999999895916591441391574335284531116485595703125
То, что здесь происходит, что x
получает округляется до назначения, потому что константа неявно преобразуется в double
, а 8.99999999999999999
не представляется в виде 64-битного числа с плавающей запятой. (Обратите внимание, что представление в виде long double
не полностью точное либо. Все цифр после первой строки 9
с являются попыткой приблизить десятичное число 8.99999999999999999
как можно ближе с использованием 96 двоичных разрядов.)
В вашем Например, нет необходимости в константе L
, так как 3.0
представляется точно как либо double
, либо long double
. Постоянное значение double
неявно преобразуется в long double
без какой-либо потери точности.
Корпус с F
не так очевиден. Это может помочь с перегрузкой, как указывает Зан Линкс. Я не уверен, но он также может избежать некоторых тонких ошибок округления (то есть, возможно, что кодирование как float
даст другой результат от кодирования как double
, затем округление до float
).
C++ FAQ: [Что такое суффиксы для числовых литералов?] (Http://www.parashift.com/c++-faq-lite/numeric-literal-suffixes.html) – legends2k
Возможный дубликат [что такое причина для явного объявления L или UL для длинных значений] (https://stackoverflow.com/questions/13134956/what-is-the-reason-for-explicitly-declaring-l-or-ul-for-long-values) –