Fortran 代码指定的双精度和编译器选项双精度之间的差异

Fortran 代码指定的双精度和编译器选项双精度之间的差异,fortran,precision,Fortran,Precision,编写Fortran代码时,通过分配kind=8或double precision来声明实变量是确保双重精度的一种方法。另一种方法是不在代码中明确声明任何内容,而是使用编译器选项,例如-r8(ifort)等 这两者有区别吗 仔细阅读此内容,尽管它不是100%重复: 及 kind=8是不可移植的,在某些编译器中不起作用,将其教给初学者,即使在一门课程中也可以看到这一点。课程应受到刑事起诉 有不同的编译器选项,具有不同的效果。1将所有4字节的实数或整数提升为8字节的1。其他设置默认种类为8。这打破了

编写Fortran代码时,通过分配
kind=8
double precision
来声明实变量是确保双重精度的一种方法。另一种方法是不在代码中明确声明任何内容,而是使用编译器选项,例如
-r8
(ifort)等


这两者有区别吗

仔细阅读此内容,尽管它不是100%重复: 及

kind=8
是不可移植的,在某些编译器中不起作用,将其教给初学者,即使在一门课程中也可以看到这一点。课程应受到刑事起诉

有不同的编译器选项,具有不同的效果。1将所有4字节的实数或整数提升为8字节的1。其他设置默认种类为8。这打破了一些关于存储和双精度的标准假设,即能够容纳比默认类型更多的数据。例如,在gfortran中:

-fdefault-real-8
将默认实数设置为8字节实数。这与以下情况不完全相同:

-freal-4-real-8
它将所有4字节的实数提升为8字节。您必须仔细理解这些差异,通常使用这些选项不是很好的做法

建议的解决方案始终相同,使用命名常量:

integer, parameter :: rp = ...
而且总是使用

real(rp) :: x

你可以有更多的常数。根据引用的问题(
real64
kind(1.d0)
selected\u real\u kind(…)
)设置常量值。

在我看来,如果您的代码不依赖于特定的编译器选项,如
-r8