Для получения этой работы в , Windows 10 I должен был открыть окно Docker Settings от системного лотка и перейти в раздел Shared Drives .
я тогда установил флажок рядом с C
. Докер попросил мои настольные учетные данные получать авторизацию записать в мою папку Users.
Тогда я выполнил контейнер докера следование примерам выше и также примеру на той странице настроек, присоединив к /data
в контейнере.
docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
Константы с плавающей запятой по умолчанию имеют тип 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
не так очевиден. Как отмечает Зан Линкс, это может помочь при перегрузках. Я не уверен, но он также может избежать некоторых незначительных ошибок округления (например, это '
Нет, объявление не подразумевает, что инициализатор имеет определенный тип. Тип инициализации один и тот же, независимо от типа инициализируемой переменной.
Итак, если вы инициализируете long double
, но используете double
для инициализации, это было бы довольно глупо. Используя суффикс L
, вы говорите, что это литерал с плавающей запятой типа long double
. Если добавить к целочисленному литералу, это будет означать, что тип имеет long int
.
Когда есть буквальное значение, оно считается быть определенного типа. 3.0 считается двойным 3 считается int. 3.0F превращается в поплавок вместо двойного. 3.0L делает его длинным двойным вместо двойного. 3L - это длинное int вместо int.
Обратите внимание, по крайней мере, в g ++ и VS08, оба ваших примера работают нормально.
Вашему примеру это не нужно, но самая большая причина, по которой я знаю использовать явные типы для литеральных значений, - это убедиться, что вызывается правильная перегрузка функции.
Это может сделать большая разница в конструкторах, перегрузках операторов и т. д.
Иногда нет удобного способа преобразовать литерал в правильный тип, поэтому приходится использовать static_cast или помещать конструктор вокруг литерала.