Эквивалент флага ifort реального размера для C

Имеют ли gcc и cl эквивалент для ifort реального размера? Если нет, то что я должен использовать вместо этого? МАКРО?

#ifdef DOUBLE_PRECISION
  #define REAL double
#else
  #define REAL float
#endif
REAL myvar;

person Peter    schedule 10.06.2014    source источник


Ответы (2)


Насколько я знаю, не существует «универсального числа с плавающей запятой», размер которого можно контролировать с помощью переключателя компилятора. Мы используем подход, аналогичный вашему, только с typedef вместо define:

#ifdef DOUBLE_PRECISION
    typedef double real;
#else
    typedef float real;
#endif

Однако это нечто большее, чем просто тип с плавающей запятой. Например, рассмотрим следующие сигнатуры функций:

double exp(double x);
float expf(float x);
long double expl(long double x);

Каждая функция имеет суффикс, обозначающий тип аргументов и возвращаемых значений. Или рассмотрим типы литералов с плавающей запятой:

1.2f   // float
1.2    // double

Если вы хотите быть в безопасности, вам также придется написать макросы для этих случаев:

#ifdef DOUBLE_PRECISION
    #define REAL(x) x
    #define SIN(x) sin(x)
#else
    #define REAL(x) x ## f
    #define SIN(x) sinf(x)
#endif

На практике я обнаружил, что при включенной оптимизации (-O2 или больше) компилятор определяет лучшие сигнатуры функций и тип, который следует использовать для литералов, поэтому я просто использую простые функции и литералы, чтобы не загромождать код. Кажется, это работает для gcc и для компиляторов Intel и PGI.

person M Oehm    schedule 10.06.2014

gfortran имеет параметр времени компиляции -fdefault-real-8. Но не gcc.

person M. S. B.    schedule 10.06.2014
comment
Спасибо, может из вопроса не так понятно, но я хочу скомпилировать код на Си, а не на Фортране. - person Peter; 10.06.2014