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

Kal*_*aju 2 precision fortran

编写Fortran代码时,通过赋值声明实数变量,kind=8或者double precision是确保双精度的一种方法.另一种方法是不在代码中明确声明任何内容,而是使用编译器选项,即-r8(ifort)等.

这两者有区别吗?

Vla*_*r F 6

仔细阅读这一点,虽然它不是100%重复: Fortran:整数*4对整数(4)与整数(kind = 4)Fortran 90种参数.

kind=8 是不可移植的,不会在某些编译器中工作并向初学者教授,即使在一门Coursera课程中也可以看到它应该受到刑事起诉.

有不同的编译器选项具有不同的效果.Ones将所有4字节实数或整数提升为8字节实数.其他设置默认类型为8.这打破了一些关于存储的标准假设以及double precision能够保持超过默认类型的一些标准假设.例如在gfortran中:

-fdefault-real-8
Run Code Online (Sandbox Code Playgroud)

将默认实数设置为8字节实数.这与以下内容并不完全相同:

-freal-4-real-8
Run Code Online (Sandbox Code Playgroud)

它将所有4字节实数提升为8字节.您必须小心了解差异,通常使用这些选项并不是一个很好的做法.

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

integer, parameter :: rp = ...
Run Code Online (Sandbox Code Playgroud)

并始终使用

real(rp) :: x
Run Code Online (Sandbox Code Playgroud)

你可以拥有更多这些常量.根据所引用的问题(将常量的值real64,kind(1.d0),selected_real_kind(...)).