Можно ли автоматически указывать константы двойной точности в операторе `данных` Фортрана?
У меня есть массив 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
их из файла в переменную массива уже объявлено соответствующим образом.