Можно ли автоматически указывать константы двойной точности в операторе `данных` Фортрана?

У меня есть массив xsolar содержит реальные значения двойной точности:

real*8        xsolar(5)

Затем массив заполняется числами, используя data заявление:

data xsolar/
     . 12.00, 10.93, 1.05, 1.38, 2.70/

По умолчанию это выглядит так, как будто числа задают только самые старшие байты, а остальные байты содержат случайные числа:

12.000000000000000
10.930000305175781
1.0499999523162842
1.3799999952316284
2.7000000476837158

Я могу решить эту проблему, написав d0 в конце чисел:

data xsolar/
     * 12.00d0, 10.93d0, 1.05d0, 1.38d0, 2.70d0/

что приведет к гораздо лучшей точности:

12.000000000000000
10.930000000000000
1.0500000000000000
1.3799999999999999
2.7000000000000002

Моя проблема в том, что у меня огромный список цифр, а не только пять. Поэтому я должен добавить d0 всем им. Можно ли это сделать автоматически, поэтому все константы в этом операторе данных обрабатываются так, как если бы они заканчивались d0? Еще лучше, это может быть сделано для всех моих заявлений данных или всех real*8 константы?

Я собираю с gfortran 6.3.0 с флагами: -O4 -ffixed-line-length-72 -ff2c,

1 ответ

Решение

В общем, Fortran делает различие между литералами одинарной и двойной точности, поэтому 10.93 а также 10.93d0 представлять совершенно разные объекты (см., например, в этом связанном посте).

Мое предложение состоит в том, чтобы посмотреть в gfortran параметры, которые позволяют некоторые (вероятно, нестандартные) преобразования. Согласно инструкции:

-fdefault-real-8
           Set the default real type to an 8 byte wide type.  Do nothing if
           this is already the default.  This option also affects the kind of
           non-double real constants like 1.0, and does promote the default
           width of "DOUBLE PRECISION" to 16 bytes if possible, unless
           "-fdefault-double-8" is given, too.

-fdefault-double-8
           Set the "DOUBLE PRECISION" type to an 8 byte wide type.  If
           -fdefault-real-8 is given, "DOUBLE PRECISION" would instead be
           promoted to 16 bytes if possible, and -fdefault-double-8 can be
           used to prevent this.  The kind of real constants like "1.d0" will
           not be changed by -fdefault-real-8 though, so also
           -fdefault-double-8 does not affect it.

Так что действительно кажется вероятным, что вы можете использовать оба варианта одновременно, -fdefault-real-8 -fdefault-double-8, чтобы сделать литералы как 1.0 быть принятым как 64-битные плавающие числа компилятором. Но вы должны убедиться, что это действительно то, что вы хотите, и побочные эффекты не влияют на остальную часть кода.

Однако, поскольку вы сказали, что у вас большой список чисел, и маловероятно, что вы собираетесь встраивать их как литералы в код внутри data Заявление, я думаю, достаточно read их из файла в переменную массива уже объявлено соответствующим образом.

Другие вопросы по тегам