我在代码中选择了精度:
integer, parameter ::psn=selected_real_kind(15,307)
然后我用_psn
编写出现在代码中的数字,例如:
y=x/6._psn
我在代码中有很多长表达式,其中许多数字出现在乘法和除法中。
现在我的问题是:有没有办法将代码中出现的所有数字的精度设置为选定的精度,而无需在任何地方明确指定_psn
?
答案 0 :(得分:0)
您可以为编译器设置real
的默认类型...
-r8 Makes default real and complex variables 8 bytes long.
-fdefault-real-8 Set the default real type to an 8 byte wide type.
然后,您可以在代码中使用1.e0
...
答案 1 :(得分:0)
以可移植的方式,没有。
如果您选择方便性和可读性而不是可移植性和可维护性,您可以使用编译器标志来更改 REAL
的默认类型,如已接受的答案所述。
重要的是要了解,在执行此操作时,可以根据标准做出的一些假设经常被打破。以下是一些示例:
REAL
,那可能会丢失,但至少在gfortran 用于该目的的常用标志仍然坚持该规则:-fdefault-real-8
将默认实型设置为 8 字节宽的类型。此选项也影响非双实常数的种类,如 1.0
。 如果可能,此选项会将 DOUBLE PRECISION
的默认宽度和双实常数(如 1.d0
)提升为 16 字节。
默认整数、默认实数或默认逻辑的非指针标量对象占用单个数字存储单元。
双精度实数或默认复数的非指针标量对象占用两个连续的数字存储单元。
最后两个暗示有一种叫做数字存储单元的东西,它是数字类型存储的基本构建块,默认为 REAL
、INTEGER
和 { {1}} 变量占据其中的 1 个,而默认 LOGICAL
和 DOUBLE PRECISION
占据其中的 2 个。不用说,当您更改默认类型时,这些合同也可能会被破坏。
有可能(甚至很可能)受影响的代码无论如何都不依赖于其中的任何一个,在这种情况下,使用这些标志是无害的。但是,了解风险仍然很重要。