2012-03-20 2 views
2

Я заметил, что этот код компилируется, но я понятия не имею, почему: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?

ответ

7

Право это GCC extension, указывающее 64-битные decimal floating point литералы.

Другие суффиксы расширения:

  • Complex literals, например, 1.0i, 1.0j, 1.0fi и т.д. Это чисто расширение GCC и стандартным способом С99 является использование макро I (1.0*I, 1.0f*I и т.д.)

  • Additional floating point types, которые являются чисто расширение GCC:

    • 1.0w__float80 (80-разрядное двоичное с плавающей точкой)
    • 1.0q__float128 (128-битовое двоичное с плавающей точкой)

  • Decimal floating point types, который основан на предложении N1312: Extension for the programming language C to support decimal floating-point arithmetic:

    • 1.0df_Decimal32 (32-разрядное десятичное с плавающей точкой)
    • 1.0dd_Decimal64 (64-разрядное десятичное с плавающей точкой)
    • 1.0dl_Decimal128 (128-разрядная десятичная плавающая точка)

  • Fixed-point types, который основан на предложении N1169: Extensions to support embedded processors:

    • 0.5hr, 0.5r, 0.5ulr и т.д. → _Fract типы (типы с фиксированной точкой величины ≤ 1)
    • 5.0hk, 5.0k, 5.0ulk и т. Д.→ _Accum типов (типы с фиксированной точкой)
+0

Спасибо за ссылки, они значительно упростили ваш ответ. – gbulmer

1

Да, это расширение GCC для поддержки decimal float. Литерал имеет тип _Decimal64, но преобразуется при присвоении переменной double.

1

Может быть, это означает плотно упакованный десятичный 64 бит?

This wikipedia article section похоже, что оно совпадает с именем определения, нет?