我有一个包含双精度实数值的数组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进行编译:{{1}}。
答案 0 :(得分:2)
一般而言,Fortran确实对单精度和双精度文字进行了区分,因此10.93
和10.93d0
表示完全不同的对象(例如,参见this related post)。
我的建议是调查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
语句中的代码中,我认为它足以{{ 1}}它们从文件到已经适当声明的数组变量。