C++ double
Содержание:
Характеристики типов с плавающей запятой
C# поддерживает следующие предварительно определенные типы с плавающей запятой:
| Ключевое слово или тип C# | Приблизительный диапазон значений | Точность | Размер | Тип .NET |
|---|---|---|---|---|
| От ±1,5 x 10−45 до ±3,4 x 1038 | 6–9 цифр | 4 байта | System.Single | |
| от ±5,0 × 10−324 до ±1,7 × 10308 | 15–17 цифр | 8 байт | System.Double | |
| от ±1,0 x 10-28 до ±7,9228 x 1028 | 28-29 знаков | 16 байт | System.Decimal |
В приведенной выше таблице каждый тип ключевого слова C# из крайнего левого столбца является псевдонимом для соответствующего типа .NET. Они взаимозаменяемые. Например, следующие объявления объявляют переменные одного типа:
По умолчанию все типы с плавающей запятой имеют значение . Все типы с плавающей запятой имеют константы и с минимальным и максимальными итоговыми значениями этого типа. Типы и также предоставляют константы, обозначающие бесконечные и нечисловые значения. Например, тип предоставляет следующие константы: Double.NaN, Double.NegativeInfinity и Double.PositiveInfinity.
Тип подходит, если требуемая степень точности определяется числом цифр справа от десятичной запятой. Такие числа обычно используются в финансовых приложениях для денежных сумм (например, 1,00 долл. США), процентных ставок (например, 2,625 %) и т. д. Даже числа, точные только до одной десятичной цифры, точнее обрабатываются типом : 0,1, например, можно в точности представить экземпляром . При этом не существует экземпляра или , который точно представляет 0,1. Из-за этой разницы в числовых типах в арифметических вычислениях могут возникать непредвиденные ошибки округления при использовании или для десятичных данных. Вы можете использовать вместо , если оптимизация производительности важнее, чем обеспечение точности. Но любая разница в производительности останется незамеченной для всех приложений, кроме самых требовательных к вычислениям. Еще одна возможная причина, по которой следует избегать , — это минимальные требования к хранилищу. Например, ML.NET использует , так как разница между 4 байтами и 16 байтами суммируется для очень больших наборов данных. Для получения дополнительной информации см. System.Decimal.
В одном и том же выражении можно сочетать и целочисленные типы, и типы и . В этом случае целочисленные типы неявно преобразуются в один из типов с плавающей запятой. При необходимости тип неявно преобразуется в . Выражение вычисляется следующим образом.
- Если в выражении есть тип , оно оценивается как или в реляционных сравнениях или сравнениях на равенство.
- Если в выражении нет типа , оно оценивается как или в реляционных сравнениях или сравнениях на равенство.
Можно также смешивать целочисленные типы и тип в выражении. В этом случае целочисленные типы неявно преобразуются в тип , а выражение вычисляется как или в реляционных сравнениях и сравнениях на равенство.
Тип нельзя смешивать с типами и в выражении. В этом случае, если требуется выполнить арифметические операции или операции сравнения или равенства, необходимо явно преобразовать операнды из типа или в тип , как показано в следующем примере:
Можно использовать строки стандартных числовых форматов или строки пользовательских числовых форматов для форматирования значения с плавающей запятой.
Work with Exponential Numbers
As mentioned above, and can also be used to represent exponential numbers. For example,
C++ outputs exponential numbers and very large numbers in a format called the scientific format. The variable ex will be outputted in this format by default since it is a very large number.
In order to force C++ to display our floating-point numbers in the format regardless of the size of the number, we use the format specifier inside of .
In addition to this, there is another format specifier known as , which displays floating-point numbers in the decimal format.
It is similar to displaying floating-point numbers by only using without , except for the fact that displays numbers up to 6 decimal points.
On the other hand, only using displays digits according to the specific compiler (6 total digits in the case of MinGW compiler, including the digits before the decimal point).
Example 4: Fixed and Scientific Formats
Output
Displaying Output With fixed: Double Type Number 1 = 3.912348 Double Type Number 2 = 32500.000000 Float Type Number 1 = 3.912348 Float Type Number 2 = 32500.000000 Displaying Output With scientific: Double Type Number 1 = 3.912348e+000 Double Type Number 2 = 3.250000e+004 Float Type Number 1 = 3.912348e+000 Float Type Number 2 = 3.250000e+004
Оператор остатка %
Оператор остатка вычисляет остаток от деления левого операнда на правый.
Целочисленный остаток
Для целочисленных операндов результатом является значение, произведенное . Знак ненулевого остатка такой же, как и у левого операнда, как показано в следующем примере:
Используйте метод Math.DivRem для вычисления результатов как целочисленного деления, так и определения остатка.
Остаток с плавающей запятой
Для операндов типа и результатом для конечных и будет значение , так что:
- знак , если отлично от нуля, совпадает со знаком ;
- абсолютное значение является значением, произведенным , где — это наибольшее возможное целое число, которое меньше или равно , а и являются абсолютными значениями и , соответственно.
Примечание
Этот метод вычисления остатка аналогичен тому, который использовался для целочисленных операндов, но отличается от спецификации IEEE 754. Если вам нужна операция вычисления остатка, которая соответствует спецификации IEEE 754, используйте метод Math.IEEERemainder.
Сведения о поведение оператора в случае неконечных операндов см. в разделе спецификации языка C#.
Для операндов оператор остатка эквивалентен типа System.Decimal.
В следующем примере показано поведение оператора остатка для операндов с плавающей запятой:
Арифметика
Продвижение/преобразование
- Унарный арифметический оператор применяется только к одному операнду. Примеры: , .
- Бинарный оператор применяется к двум операндам. Примеры: , , . .
- Если операнд имеет тип , или (как , так и ), тогда он продвигается до (), если может содержать все значения исходного типа. В противном случае он продвигается до . Процесс продвижения происходит без потерь. Примеры:
- В реализации присутствуют 16-битный и 24-битный . Если переменные и имеют тип , то операция продвигает оба операнда до .
- В реализации присутствуют 32-битный и 32-битный . Если переменные и имеют тип , то операция продвигает оба операнда до .
- В случае двоичных операторов оба операнда перед арифметической операцией неявно преобразуются в одинаковый общий тип. Ранги преобразования возрастают в следующем порядке: , , . Рангом общего типа считается старший ранг среди типов двух операндов. Если оба операнда являются , то их общий тип будет иметь ту же характеристику. Если же операнд с беззнаковым типом имеет старший или равный ранг по отношению ко второму операнду, то их общий тип будет беззнаковым. В случае, когда тип операнда со знаком может представлять все значения другого типа операнда, общий тип будет иметь знак. В противном случае общий тип получается беззнаковым. Примеры:
- ;
- ;
- ;
- если является 32-битным, а long 64-битным: ;
- если и оба являются 32-битными: .
Неопределенное поведение
Знаковое переполнение:
- При выполнении арифметических операций над целочисленным типом переполнение считается неопределенным поведением (UB). Такое поведение может вызывать верные, несогласованные и/или неверные действия как сразу, так и в дальнейшем.
- При выполнении арифметики над беззнаковым целым (после продвижений и преобразований) любое переполнение гарантированно вызовет оборот значения. Например, .
- Выполнение арифметики над беззнаковыми целыми фиксированного размера может привести к едва уловимым ошибкам. Например:
- Пусть , и равен 32-битам. Тогда , ,; и будут продвинуты до , и приведет к переполнению , вызвав неопределенное поведение.
- Пусть , и равен 33-битам. Тогда , , ; и будут продвинуты до , и приведет к переполнению , то есть неопределенному поведению.
- Чтобы обеспечить безопасную арифметику с беззнаковыми целыми, нужно либо прибавить , либо умножить на в качестве пустой операции. Например: или . Это гарантирует, что операнды будут продвинуты как минимум до ранга и при этом останутся без знаков.
Деление/остаток:
- Деление на нуль и остаток с делителем нуля также относятся к неопределенному поведению.
- Беззнаковое деление/остаток не имеют других особых случаев.
- Деление со знаком может вызывать переполнение, например .
- Остаток со знаком при отрицательных операндах может вызывать сложности, так как некоторые части являются однообразными, в то время как другие определяются реализацией.
Битовые сдвиги:
- Неопределенным поведением считается битовый сдвиг (< < и >>) на размер, который либо отрицателен, либо равен или больше битовой ширины.
- Левый сдвиг беззнакового операнда (после продвижения/преобразования) считается определенным правильно и отклонений в поведении не вызывает.
- Левый сдвиг операнда со знаком, содержащего неотрицательное значение, вследствие которого 1 бит переходит в знаковый бит, является неопределенным поведением.
- Левый сдвиг отрицательного значения относится к неопределенному поведению.
- Правый сдвиг неотрицательного значения (в типе операнда без знака или со знаком) считается определенным правильно и отклонений в поведении не вызывает.
- Правый сдвиг отрицательного значения определяется реализацией.
Общие понятия
Типом данных в программировании называют совокупность двух множеств: множество значений и множество операций, которые можно применять к ним. Например, к типу данных целых неотрицательных чисел, состоящего из конечного множества натуральных чисел, можно применить операции сложения (+), умножения (*), целочисленного деления (/), нахождения остатка (%) и вычитания (−).
Язык программирования, как правило, имеет набор примитивных типов данных — типы, предоставляемые языком программирования как базовая встроенная единица. В C++ такие типы создатель языка называет фундаментальными типами. Фундаментальными типами в C++ считаются:
- логический ();
- символьный (напр., );
- целый (напр., );
- с плавающей точкой (напр., );
- перечисления (определяется программистом);
- .
Поверх перечисленных строятся следующие типы:
- указательные (напр., );
- массивы (напр., );
- ссылочные (напр., );
- другие структуры.
Перейдём к понятию литерала (напр., 1, 2.4F, 25e-4, ‘a’ и др.): литерал — запись в исходном коде программы, представляющаясобой фиксированное значение. Другими словами, литерал — это просто отображение объекта (значение) какого-либо типа в коде программы. В C++ есть возможность записи целочисленных значений, значений с плавающей точкой, символьных, булевых, строковых.
Литерал целого типа можно записать в:
- 10-й системе счисления. Например, ;
- 8-й системе счисления в формате 0 + число. Например, ;
- 16-й системе счисления в формате 0x + число. Например, .
24, 030, 0x18 — это всё записи одного и того же числа в разных системах счисления.
Для записи чисел с плавающей точкой используют запись через точку: 0.1, .5, 4. — либо в
экспоненциальной записи — 25e-100. Пробелов в такой записи быть не должно.
Имя, с которым мы можем связать записанные литералами значения, называют переменной. Переменная — это поименованная либо адресуемая иным способом область памяти, адрес которой можно использовать для доступа к данным. Эти данные записываются, переписываются и стираются в памяти определённым образом во время выполнения программы. Переменная позволяет в любой момент времени получить доступ к данным и при необходимости изменить их. Данные, которые можно получить по имени переменной, называют значением переменной.
Для того, чтобы использовать в программе переменную, её обязательно нужно объявить, а при необходимости можно определить (= инициализировать). Объявление переменной в тексте программы обязательно содержит 2 части: базовый тип и декларатор. Спецификатор и инициализатор являются необязательными частями:
const int example = 3; // здесь const — спецификатор // int — базовый тип // example — имя переменной // = 3 — инициализатор.
Имя переменной является последовательностью символов из букв латинского алфавита (строчных и прописных), цифр и/или знака подчёркивания, однако первый символ цифрой быть не может. Имя переменной следует выбирать таким, чтобы всегда было легко догадаться о том, что она хранит, например, «monthPayment». В конспекте и на практиках мы будем использовать для правил записи переменных нотацию CamelCase. Имя переменной не может совпадать с зарезервированными в языке словами, примеры таких слов: if, while, function, goto, switch и др.
Декларатор кроме имени переменной может содержать дополнительные символы:
- — указатель; перед именем;
- — константный указатель; перед именем;
- — ссылка; перед именем;
- — массив; после имени;
- — функция; после имени.
Инициализатор позволяет определить для переменной её значение сразу после объявления. Инициализатор начинается с литерала равенства (=) и далее происходит процесс задания значения переменной. Вообще говоря, знак равенства в C++ обозначает операцию присваивания; с её помощью можно задавать и изменять значение переменной. Для разных типов он может быть разным.
Спецификатор задаёт дополнительные атрибуты, отличные от типа. Приведённый в примере спецификатор const позволяет запретить последующее изменение значение переменной. Такие неизменяемые переменные называют константными или константой.
Объявить константу без инициализации не получится по логичным причинам:
const int EMPTY_CONST; // ошибка, не инициализована константная переменная const int EXAMPLE = 2; // константа со значением 2 EXAMPLE = 3; // ошибка, попытка присвоить значение константной переменной
Для именования констант принято использовать только прописные буквы, разделяя слова символом нижнего подчёркивания.
Приоритет и ассоциативность операторов
В следующем списке перечислены арифметические операторы в порядке убывания приоритета:
- Постфиксный инкремент и декремент
- Префиксный инкремент и декремент , унарные операторы и
- Мультипликативные операторы , , и
- Аддитивные операторы и
Бинарные арифметические операторы имеют левую ассоциативность. То есть операторы с одинаковым приоритетом вычисляются в направлении слева направо.
Порядок вычисления, определяемый приоритетом и ассоциативностью операторов, можно изменить с помощью скобок ().
Полный список операторов C#, упорядоченный по уровню приоритета, можно найти в разделе статьи Операторы C#.
Решение
когда повышен до в интегральных акциях отрицательные значения также теряются (что приводит к такому веселью, как быть правдой).
Как и большинство механизмов в C (которые наследуются в C ++), обычные арифметические преобразования следует понимать с точки зрения аппаратных операций. Создатели C были очень хорошо знакомы с языком ассемблера машин, с которыми они работали, и они написали C, чтобы иметь непосредственный смысл для себя и людей, подобных себе, при написании вещей, которые до этого были бы написаны на ассемблере (например, UNIX). ядро).
Теперь процессоры, как правило, не имеют инструкций смешанного типа (добавьте float к double, сравните int с float и т. Д.), Потому что это будет огромной тратой недвижимости на пластине — вам придется реализовать столько опкодов, сколько вы хотите, чтобы поддерживать различные типы. То, что у вас есть только инструкции для «добавить int к int», «сравнить float с float», «умножить без знака на unsigned» и т. Д., Делает обычные арифметические преобразования необходимыми в первую очередь — они представляют собой отображение двух типов на инструкцию семья, которая имеет больше всего смысла использовать с ними.
С точки зрения того, кто привык писать низкоуровневый машинный код, если у вас смешанные типы, инструкции на ассемблере, которые вы, скорее всего, рассмотрите в общем случае, — это инструкции, которые требуют наименьшего количества преобразований. Это особенно относится к плавающим точкам, где преобразования требуют больших затрат времени, особенно в начале 1970-х годов, когда разрабатывался C, компьютеры работали медленно и когда вычисления с плавающей точкой выполнялись программно. Это показано в обычных арифметических преобразованиях — только один операнд когда-либо был преобразован (за единственным исключением: /, где может быть преобразован в , что не требует ничего делать на большинстве машин. Возможно, не в любом месте, где применяется исключение).
Итак, обычные арифметические преобразования написаны для того, чтобы делать то, что кодировщик сборки делал бы большую часть времени: у вас есть два типа, которые не подходят, преобразуйте один в другой, чтобы он это делал. Это то, что вы будете делать в ассемблерном коде, если у вас нет особой причины поступать иначе, а также для людей, которые привыкли писать ассемблерный код и делать иметь конкретную причину, чтобы вызвать другое преобразование, явно запрашивая, что преобразование является естественным. В конце концов, вы можете просто написать
Интересно отметить в этом контексте, кстати, что выше в иерархии, чем так что сравнивая с закончится в неподписанном сравнении (отсюда немного с самого начала). Я подозреваю, что это показатель того, что люди в старину считали меньше как ограничение на чем как расширение его диапазона значений: нам сейчас не нужен знак, поэтому давайте используем дополнительный бит для большего диапазона значений. Вы бы использовали его, если бы у вас были основания ожидать, что переполнится — гораздо большее беспокойство в мире 16-бит s.
68
Объединения
Доступ к одним и тем же данным разными способами:
#include <stdio.h>
struct Point {
union {
struct XYZ
{
float x;
float y;
float z;
};
float coords3;
};
};
int main() {
struct Point pt = {.x = 1.f, .y = 2.f, .z = 3.f};
printf("%zu\n", sizeof(pt));
for (int i = ; i < 3; ++i) {
printf("%f\n", pt.coordsi);
}
return ;
}
Т. н. type punning (каламбур типизации)
#include <stdio.h>
#include <stdint.h>
float ChangeSign(float x) {
union {
float floatValue;
uint32_t intValue;
} u;
u.floatValue = x;
u.intValue ^= (1U << 31);
return u.floatValue;
}
int main() {
printf("%f\n", ChangeSign(1.25f));
return ;
}
Стандартом C99 это разрешается (в отличие от приведения указателей разных типов).
Числовые типы данных
| Тип данных | Объем памяти | Диапазон | Описание |
| TINYINT (M) | 1 байт | от -128 до 127 или от 0 до 255 | Целое число. Может быть объявлено положительным с помощью ключевого слова UNSIGNED, тогда элементам столбца нельзя будет присвоить отрицательное значение. Необязательный параметр М — количество отводимых под число символов. Необязательный атрибут ZEROFILL позволяет свободные позиции по умолчанию заполнить нулями.Примеры: TINYINT — хранит любое число в диапазоне от -128 до 127. TINYINT UNSIGNED — хранит любое число в диапазоне от 0 до 255. TINYINT (2) — предполагается, что значения будут двузначными, но по факту будет хранить и трехзначные. TINYINT (3) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 002. |
| SMALLINT (M) | 2 байта | от -32768 до 32767 или от 0 до 65535 | Аналогично предыдущему, но с большим диапазоном.Примеры: SMALLINT — хранит любое число в диапазоне от -32768 до 32767. SMALLINT UNSIGNED — хранит любое число в диапазоне от 0 до 65535. SMALLINT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить и пятизначные. SMALLINT (4) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 0002. |
| MEDIUMINT (M) | 3 байта | от -8388608 до 8388608 или от 0 до 16777215 | Аналогично предыдущему, но с большим диапазоном.Примеры: MEDIUMINT — хранит любое число в диапазоне от -8388608 до 8388608. MEDIUMINT UNSIGNED — хранит любое число в диапазоне от 0 до 16777215. MEDIUMINT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить и семизначные. MEDIUMINT (5) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 00002. |
| INT (M) или INTEGER (M) | 4 байта | от -2147683648 до 2147683648 или от 0 до 4294967295 | Аналогично предыдущему, но с большим диапазоном.Примеры: INT — хранит любое число в диапазоне от -2147683648 до 2147683648. INT UNSIGNED — хранит любое число в диапазоне от 0 до 4294967295. INT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить максимально возможные. INT (5) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 00002. |
| BIGINT (M) | 8 байта | от -263 до 263-1 или от 0 до 264 | Аналогично предыдущему, но с большим диапазоном.Примеры: BIGINT — хранит любое число в диапазоне от -263 до 263-1. BIGINT UNSIGNED — хранит любое число в диапазоне от 0 до 264. BIGINT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить максимально возможные. BIGINT (7) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 0000002. |
| BOOL или BOOLEAN | 1 байт | либо 0, либо 1 | Булево значение. 0 — ложь (false), 1 — истина (true). |
| DECIMAL (M,D) или DEC (M,D) или NUMERIC (M,D) | M + 2 байта | зависят от параметров M и D | Используются для величин повышенной точности, например, для денежных данных. M — количество отводимых под число символов (максимальное значение — 64). D — количество знаков после запятой (максимальное значение — 30).Пример: DECIMAL (5,2) — будет хранить числа от -99,99 до 99,99. |
| FLOAT (M,D) | 4 байта | мин. значение +(-) 1.175494351 * 10-39 макс. значение +(-) 3. 402823466 * 1038 |
Вещественное число (с плавающей точкой). Может иметь параметр UNSIGNED, запрещающий отрицательные числа, но диапазон значений от этого не изменится. M — количество отводимых под число символов. D — количество символов дробной части. Пример: FLOAT (5,2) — будет хранить числа из 5 символов, 2 из которых будут идти после запятой (например: 46,58). |
| DOUBLE (M,D) | 8 байт | мин. значение +(-) 2.2250738585072015 * 10-308 макс. значение +(-) 1.797693134862315 * 10308 |
Аналогично предыдущему, но с большим диапазоном. Пример: DOUBLE — будет хранить большие дробные числа. |
Объявление и инициализация переменных
В общем случае при объявлении переменной в C#, вначале указывается тип данных переменной, затем ее имя:
int nVal; string strVal;
Задание значения переменной можно произвести в момент инициализации:
int radius = 10; string name = "John";
либо после инициализаций:
string name; name = "John";
Необходимо иметь ввиду, что переменную нельзя использовать до тех пор пока она не будет проинициализирована, Например, выполнение следующей программы завершится с ошибкой:
int notInitedVal; Console.Write(notInitedVal);
В примерах мы не будем приводить код импорта и объявления класса. В конце главы будет приведен листинг программы со всеми примерами из данного урока.
Ключевое слово new
Ключевое слово new, как правило, используется при инициализации переменных, которые имеют ссылочный тип данных. О том, что это такое мы расскажем чуть ниже. Пусть у нас есть класс Rectangle
class Rectangle
{
public double Width = 0;
public double Height = 0;
}
Данный класс нам нужен только для демонстрации, при разработке собственных классов не стоит создать поля с ключевым словом public. О создании классов и основах объектно-ориентированного программирования будет рассказано в одном из ближайших уроков.
Создадим переменную класса Rectangle
Rectangle rect = new Rectangle();
Console.WriteLine($"Rectangle Width={rect.Width}, Height={rect.Height}");
Переменные типа int, double и т.п. также можно проинициализировать с помощью ключевого слова new, в этом случае будет присвоено значение по умолчанию:
int newInitedValue = new int();
Console.WriteLine("Default int value: " + newInitedValue);
Ключевое слово var. Неявная типизация
При объявлении переменной вместо явного задания типа можно поставить ключевое слово var. В этом случае будет использована система вывода типов для определения типа переменной по ее значению.
int v1 = 12345;
var v2 = 12345;
Console.WriteLine($"Type of v1: {v1.GetType()}\nType of v2: {v2.GetType()}");
При работе с var необходимо помнить следующее:
- использовать var можно только для объявления локальных переменных;
- var нельзя использоваться для объявления типа возвращаемого значения, типов полей и параметров;
- при объявлении переменной с использованием var она обязательно должна быть проинициализирована, при этом использовать для этого null запрещено;
- объявлять переменную допускающую null-значение с использованием лексемы ? через var нельзя.
Диапазоны значений простых типов данных в C++ для IBM PC-совместимых компьютеров
Q: Что означает термин IBM PC-совместимый компьютер?
A: IBM PC-совместимый компьютер (англ. IBM PC compatible) — компьютер, архитектурно близкий к IBM PC, XT и AT. IBM PC-совместимые компьютеры построены на базе микропроцессоров, совместимых с Intel 8086 (а, как известно, все выпущенные позднее процессоры Intel имеют полную обратную совместимость с 8086). По сути это практически все современные компьютеры.
Различные виды целых и вещественных типов, различающиеся диапазоном и точностью представления данных, введены для того, чтобы дать программисту возможность наиболее эффективно использовать возможности конкретной аппаратуры, поскольку от выбора типа зависит скорость вычислений и объем памяти. Но оптимизированная для компьютеров какого-либо одного типа программа может стать не переносимой на другие платформы, поэтому в общем случае следует избегать зависимостей от конкретных характеристик типов данных.
| Тип | Диапазон значений | Размер (байт) |
| bool | true и false | 1 |
| signed char | -128 … 127 | 1 |
| unsigned char | 0 … 255 | 1 |
| signed short int | -32 768 … 32 767 | 2 |
| unsigned short int | 0 … 65 535 | 2 |
| signed long int | -2 147 483 648 … 2 147 483 647 | 4 |
| unsigned long int | 0 … 4 294 967 295 | 4 |
| float | 3.4e-38 … 3.4e+38 | 4 |
| double | 1.7e-308 … 1.7C+308 | 8 |
| long double | 3.4e-4932 … 3.4e+4932 | 10 |
Для вещественных типов в таблице приведены абсолютные величины минимальных и максимальных значений.


