Почему необходимо добавить L или F после того, как значение присвоило постоянному C++?

Для получения этой работы в , Windows 10 I должен был открыть окно Docker Settings от системного лотка и перейти в раздел Shared Drives .

я тогда установил флажок рядом с C. Докер попросил мои настольные учетные данные получать авторизацию записать в мою папку Users.

Тогда я выполнил контейнер докера следование примерам выше и также примеру на той странице настроек, присоединив к /data в контейнере.

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
15
задан ybakos 4 September 2009 в 17:47
поделиться

4 ответа

Константы с плавающей запятой по умолчанию имеют тип 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 s представляют собой попытку приблизиться к десятичному числу 8.99999999999999999 как можно точнее, используя 96 двоичных разрядов.)

В вашем примере нет необходимости в константе L , потому что 3.0 точно может быть представлен либо как двойной или длинный двойной . Постоянное значение double неявно преобразуется в long double без какой-либо потери точности.

Случай с F не так очевиден. Как отмечает Зан Линкс, это может помочь при перегрузках. Я не уверен, но он также может избежать некоторых незначительных ошибок округления (например, это '

17
ответ дан 1 December 2019 в 01:30
поделиться

Нет, объявление не подразумевает, что инициализатор имеет определенный тип. Тип инициализации один и тот же, независимо от типа инициализируемой переменной.

Итак, если вы инициализируете long double , но используете double для инициализации, это было бы довольно глупо. Используя суффикс L , вы говорите, что это литерал с плавающей запятой типа long double . Если добавить к целочисленному литералу, это будет означать, что тип имеет long int .

13
ответ дан 1 December 2019 в 01:30
поделиться

Когда есть буквальное значение, оно считается быть определенного типа. 3.0 считается двойным 3 считается int. 3.0F превращается в поплавок вместо двойного. 3.0L делает его длинным двойным вместо двойного. 3L - это длинное int вместо int.

Обратите внимание, по крайней мере, в g ++ и VS08, оба ваших примера работают нормально.

4
ответ дан 1 December 2019 в 01:30
поделиться

Вашему примеру это не нужно, но самая большая причина, по которой я знаю использовать явные типы для литеральных значений, - это убедиться, что вызывается правильная перегрузка функции.

Это может сделать большая разница в конструкторах, перегрузках операторов и т. д.

Иногда нет удобного способа преобразовать литерал в правильный тип, поэтому приходится использовать static_cast или помещать конструктор вокруг литерала.

1
ответ дан 1 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: