В стандарте C ++ говорится о плавающих литералах:
Если масштабированное значение не находится в диапазоне представимых значений для его типа, программа является некорректной.
Масштабированное значение — это значительная часть, умноженная на 10 ^ экспоненциальную часть.
Под x86-64:
float
это IEEE-754 одинарной точностиdouble
является IEEE-754 двойной точностиlong double
это 80-битная расширенная точность IEEE-754В этом контексте, каков диапазон представляемых значений для каждого из этих трех типов? Где это задокументировано? или как рассчитывается?
Ответ (если вы находитесь на машине с плавающей точкой IEEE)
в float.h
, FLT_MAX
, DBL_MAX
а также LDBL_MAX
, В системе
с полной поддержкой IEEE, что-то около 3.4e + 38, 1.8E + 308 и
1.2E4932. (Точные значения могут отличаться и могут быть выражены
по-разному, в зависимости от того, как компилятор делает свой ввод и
округления. g ++, например, определяет их как компилятор
встроенные модули.)
РЕДАКТИРОВАТЬ:
WRT ваш вопрос (так как ни я, ни другие респонденты
на самом деле ответил): диапазон представимых значений
[-type_MAX...type]
, где
type
один из FLT
, DBL
, или же LDBL
,
Если вы знаете количество экспонентных битов и битов мантиссы, то на основе Формат IEEE-754, можно установить, что максимальное абсолютное представимое значение равно:
2^(2^(E-1)-1)) * (1 + (2^M-1)/2^M)
Минимальное абсолютное значение (не включая ноль или денормализованные числа) является:
2^(2-2^(E-1))
E
это 8, M
23E
это 11, M
это 52.Я искал наибольшее представимое число в 64 бита и закончил тем, что создал свой собственный 500-значный калькулятор с плавающей запятой. Это то, что я придумаю, если все 64 бита включены
18.446.744.073.709.551.615
18 квинтиллионов 446 квадриллионов 744 триллионов 73 миллиарда 709 миллионов 551 тысяча 615