Как определить константу с плавающей запятой двойной точности в C89 - PullRequest
2 голосов
/ 08 июля 2019

У меня есть код с константой, объявленной в представлении, которая недопустима в c89 (опция компилятора в историческом проекте).

#define K_MAX_KCG_REAL 0x1.FFFFFFFFFFFFFp1023

Я ищу решение, действительное в c89

Я пытался

#define K_MAX_KCG_REAL 0x7FEFFFFFFFFFFFFF

, но интерпретируется как целое число со значением с плавающей точкой прибл. 9.22e18. Вдали от 1.79e308, что мне нужно. Каков наилучший способ объявить константу с максимальным значением для двойной точности?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Номер, который вы ищете: 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.

Если <float.h> определено DBL_MAX, вы должны использовать его.

Для многих компиляторов достаточно 1.7976931348623157e308.

Если компилятор не сможет их правильно проанализировать, вы можете попробовать (9007199254740991. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 1073741824. * 2048.)

0 голосов
/ 08 июля 2019

Вам потребуется создать объединение, содержащее unsigned long long и double, и инициализировать первое.

const union {
    unsigned long long i;
    double d;
} K_MAX_KCG_REAL = { 0x7FEFFFFFFFFFFFFF };
...