Имеют ли gcc
и cl
эквивалент для ifort
реального размера? Если нет, то что я должен использовать вместо этого? МАКРО?
#ifdef DOUBLE_PRECISION
#define REAL double
#else
#define REAL float
#endif
REAL myvar;
Имеют ли gcc
и cl
эквивалент для ifort
реального размера? Если нет, то что я должен использовать вместо этого? МАКРО?
#ifdef DOUBLE_PRECISION
#define REAL double
#else
#define REAL float
#endif
REAL myvar;
Насколько я знаю, не существует «универсального числа с плавающей запятой», размер которого можно контролировать с помощью переключателя компилятора. Мы используем подход, аналогичный вашему, только с 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.
gfortran имеет параметр времени компиляции -fdefault-real-8
. Но не gcc.