我有一个用 Fortran 编写的非常大的代码,用于建立并迭代求解非线性偏微分方程组。我需要所有变量都是双精度的。在我为代码编写的附加模块中,我将所有变量声明为双精度类型,但我的模块仍然使用旧源代码中声明为 real 类型的变量。所以我的问题是,当单精度变量乘以 Fortran 中的双精度变量时会发生什么?如果用于存储值的变量声明为双精度,结果是否为双精度?如果双精度值乘以末尾没有“D0”的常数会怎样?我可以在 Intel 11.1 中设置一个编译器选项来使所有实数/双精度/双精度常数吗?
我一直在尝试使用Fortran作为我的研究项目,使用GNU Fortran编译器(gfortran),最新版本,但我在处理实数时遇到了一些问题.如果您有代码:
program test
implicit none
real :: y = 23.234, z
z = y * 100000
write(*,*) y, z
end program
Run Code Online (Sandbox Code Playgroud)
你会得到输出:
23.23999 2323400.0
Run Code Online (Sandbox Code Playgroud)
我发现这很奇怪.有人能告诉我这里到底发生了什么吗?看看z我可以看到y确实保留了它的精度,所以对于我认为应该不成问题的计算.但是为什么y的输出与我指定的值不完全相同,我能做些什么才能使它完全相同?
我想在fortran初始化一个大整数数组,我试过:
integer(kind=8) :: XGrid(1:20)
Run Code Online (Sandbox Code Playgroud)
但整数仍然是默认类= 4.我后来在数组中添加了数字:
XGrid = (/3002, 3340403,....,19460630000/)
Run Code Online (Sandbox Code Playgroud)
我收到"此数字常量超出范围"错误.因为它不适合一种kind = 4 int,但会在一种= 8 int.
我也尝试将其声明为:
integer, parameter :: ik8 = selected_int_kind(8)
integer(ik8) :: XGrid(1:20)
Run Code Online (Sandbox Code Playgroud)
但这也行不通.
编辑:感谢Vladimir F,但我试图定义一个数组而不仅仅是一个变量,因此我无法理解如何调整使用的答案: Fortran 90中有更好的双精度赋值吗? 可不可能是:
integer, parameter :: ik8 = selected_int_kind(8)
integer(ik8) :: XGrid(1:20)_ik8
XGrid = (/3002_ik8, 3340403_ik8,....,19460630000_ik8/)
Run Code Online (Sandbox Code Playgroud)
还是不一样?谢谢