У стандарті C ++ говориться про плаваючі літерали:
Якщо масштабоване значення не знаходиться в діапазоні репрезентативних значень для його типу, програма погано сформована.
Масштабоване значення - значна частина, помножена на частину 10 ^.
Під x86-64:
float
являє собою одноточну точність IEEE-754double
являє собою подвійну точність IEEE-754long double
є 80-бітною розширеною точністю IEEE-754
У цьому контексті, який діапазон повторюваних значень для кожного з цих трьох типів? Де це задокументовано? або як він обчислюється?
Відповіді:
2 для відповіді № 1Відповідь (якщо ви знаходитесь на машині з плаваючою точкою IEEE) є в float.h
. FLT_MAX
, DBL_MAX
і LDBL_MAX
. У системі з повною підтримкою IEEE, щосьблизько 3.4e + 38, 1.8E + 308 та 1.2E4932. (Точні значення можуть змінюватися і можуть бути виражені інакше, в залежності від того, як компілятор робить свій вхід і округлення. g ++, наприклад, визначає їх як компілятор вбудовані модулі.)
EDIT:
WRT ваше питання (оскільки ні я, ні інші відповіді насправді відповів): діапазон репрезентативних значень
[-type_MAX...type]
, де
type
є однією з FLT
, DBL
, або LDBL
.
3 для відповіді № 2
Якщо ви знаєте кількість біт експонента і біти мантиси, то засновані на Формат IEEE-754, можна встановити, що максимальне абсолютне репрезентативне значення:
2^(2^(E-1)-1)) * (1 + (2^M-1)/2^M)
Мінімальна абсолютна величина (не включаючи нуль або. \ T денормали) є:
2^(2-2^(E-1))
- Для одноточної точності,
E
8,M
23. - Для подвійної точності,
E
11,M
52. - Для розширеної точності, я не впевнений. Якщо ви маєте на увазі 80-бітну точність x87 FPU, то, наскільки я можу сказати, це не сумісний з IEEE-754...
-3 для відповіді № 3
Я шукав найбільший reprezentable число 64 бітами та закінчуючи роблячи мій власний 500 цифру плаваючою точкою калькулятор. Це те, що я придумав, якщо всі 64 біти включені
18,446,744,073,709,551,615
18 тис. 446 кв. 744 трлн. 73 млрд. 709 млн. 551 тис. 615