C Числовое обозначение с плавающей запятой
Я заметил, что этот код компилируется, но я понятия не имею, почему:
int main() {
double z = 0.000000000000001E-383DD;
}
Но я не уверен, что DD
в конце числа означает. Я просмотрел стандарт, но об этом ничего не сказано.
Я получил этот номер из следующей команды:
$ gcc -dM -E - < /dev/null
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __DEC64_DEN__ 0.000000000000001E-383DD
...
Может ли это быть расширение GCC?
3 ответа
Правильно, это расширение GCC для указания 64-битных десятичных литералов с плавающей запятой.
Другие расширения суффиксы:
Сложные литералы, например
1.0i
,1.0j
,1.0fi
и т. д. Это чисто расширение GCC и стандартный способ C99 - использовать макросI
(1.0*I
,1.0f*I
, так далее.)Дополнительные типы с плавающей точкой, которые являются просто расширением GCC:
1.0w
→__float80
(80-битная двоичная с плавающей точкой)1.0q
→__float128
(128-битная двоичная с плавающей точкой)
Типы десятичных чисел с плавающей запятой, основанные на предложении N1312: Расширение для языка программирования C для поддержки десятичной арифметики с плавающей запятой:
1.0df
→_Decimal32
(32-разрядное десятичное число с плавающей запятой)1.0dd
→_Decimal64
(64-битная десятичная с плавающей запятой)1.0dl
→_Decimal128
(128-битная десятичная с плавающей запятой)
Типы с фиксированной запятой, основанные на предложении N1169: Расширения для поддержки встроенных процессоров:
0.5hr
,0.5r
,0.5ulr
и т. д. →_Fract
типы (типы с фиксированной точкой с величиной ≤ 1)5.0hk
,5.0k
,5.0ulk
и т. д. →_Accum
типы (типы с фиксированной запятой)
Да, это расширение GCC для поддержки десятичного числа с плавающей точкой. Литерал имеет тип _Decimal64
, но преобразуется при назначении на double
переменная.
Может быть, это означает плотно упакованный десятичный разряд в 64 бита?
Этот раздел статьи в Википедии выглядит так, как будто он соответствует названию определения, нет?