Где стандарт C ++ определяет диапазон значений типов с плавающей запятой? - PullRequest
2 голосов
/ 29 ноября 2009

Насколько я знаю, значения с плавающей запятой имеют вид 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, это:

Существует три типа с плавающей точкой: float, double и long double. Тип double обеспечивает, по крайней мере, такую ​​же точность, как и float, а тип long double обеспечивает, по крайней мере, такую ​​же точность, что и double. Набор значений типа float является подмножеством набора значений типа double; набор значений типа double является подмножеством набора значений типа long double. Представление значений типов с плавающей запятой определяется реализацией.

И нет упоминания о минимальном диапазоне, предоставляемом типом.

Где / как стандарт определяет (минимальный?) Диапазон значений для типов с плавающей запятой? Или компилятор может свободно выбирать любой диапазон значений и при этом соответствовать стандарту?

Ответы [ 3 ]

6 голосов
/ 29 ноября 2009

Вы процитировали все, что гарантировано о типах с плавающей запятой в C ++. Как говорится, их представление определяется реализацией.

Тем не менее, вы можете запросить информацию о пределах и о том, являются ли типы указанными типами IEC 559 (IEEE 754), используя шаблоны std::numeric_limits в <limits>.

2 голосов
/ 29 ноября 2009

Стандарт не определяет такие вещи, потому что они часто зависят от оборудования и меняются со временем. В то время как сегодня 32 бита считаются стандартом, через 10 лет выполнение менее 64 бит может показаться неприятным.

1 голос
/ 29 ноября 2009

Как и целочисленные числовые ограничения, ограничения для float, double и long double импортируются из стандарта C. Минимальное значение для констант FLT_MAX, DBL_MAX и LDBL_MAX составляет 1E+37. Для их *_MIN вариантов максимальное значение равно 1E-37.

...