Где стандарт C ++ определяет диапазон значений типов с плавающей запятой?
-
08-07-2019 - |
Вопрос
Насколько я знаю, значения с плавающей запятой имеют вид n * 2 ^ e, с
- диапазон значений с плавающей запятой равен n = -(2^23-1) - (2^23-1), и e = -126 - 127,
- двойной диапазон равен n = -(2^52-1) - (2^52-1), и e = -1022 - 1023
Я просматривал стандарт C ++, но не смог найти место, где стандарт определяет это или предписывает ассоциацию типов float, double и long double с диапазонами, определенными в других стандартах (IEEE).Единственная связанная вещь, которую я нашел в 3.9.1.8, это:
Существует три типа с плавающей запятой:плавающий, двойной и длинный двойной.Тип double обеспечивает по меньшей мере такую же точность, как float, а тип long double обеспечивает по меньшей мере такую же точность, как double.Набор значений типа float является подмножеством набора значений типа double;набор значений типа double является подмножеством набора значений типа long double.Представление значений типов с плавающей запятой определяется реализацией.
И никакого упоминания о минимальном диапазоне, предусмотренном типом.
Где / как стандарт определяет (минимальный?) диапазон значений типов с плавающей запятой?Или компилятор может свободно выбирать любой диапазон значений и при этом оставаться совместимым со стандартом?
Решение
Точно так же, как пределы целых чисел, пределы для float
, double
и long double
импортируются из стандарта C.Минимальное значение для констант FLT_MAX
, DBL_MAX
и LDBL_MAX
является 1E+37
.Для их *_MIN
варианты максимальное значение равно 1E-37
.
Другие советы
То, что вы процитировали, - это все, что гарантировано о типах с плавающей запятой в C ++.Как говорится, их представление определяется реализацией.
Однако вы можете запросить информацию об ограничениях и о том, являются ли типы типами, указанными в стандарте IEC 559 (IEEE 754), используя std::numeric_limits
шаблоны в <limits>
.
Стандарт не определяет такие вещи, потому что они часто зависят от аппаратного обеспечения и меняются с течением времени.Хотя сегодня 32 бита считаются стандартом, через 10 лет выполнение чего-либо менее чем в 64 битах может показаться неприятным.