是否可以在Fortran`data`语句中自动提供双精度常量?

时间:2018-03-18 04:10:05

标签: fortran precision gfortran

我有一个包含双精度实数值的数组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​​}}。

1 个答案:

答案 0 :(得分:2)

一般而言,Fortran确实对单精度和双精度文字进行了区分,因此10.9310.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}}它们从文件到已经适当声明的数组变量。