Bob*_*Bob 3 precision double fortran
我有一个用 Fortran 编写的非常大的代码,用于建立并迭代求解非线性偏微分方程组。我需要所有变量都是双精度的。在我为代码编写的附加模块中,我将所有变量声明为双精度类型,但我的模块仍然使用旧源代码中声明为 real 类型的变量。所以我的问题是,当单精度变量乘以 Fortran 中的双精度变量时会发生什么?如果用于存储值的变量声明为双精度,结果是否为双精度?如果双精度值乘以末尾没有“D0”的常数会怎样?我可以在 Intel 11.1 中设置一个编译器选项来使所有实数/双精度/双精度常数吗?
所以我的问题是,当单精度变量乘以 Fortran 中的双精度变量时会发生什么? 将单精度提升为双精度,以双精度进行运算。
如果用于存储值的变量声明为双精度,结果是否为双精度? 不必要。右侧是一个表达式,它不“知道”左侧变量的精度,该变量将存储在左侧。如果Double = SingleA * SingleB(使用名称来指示类型),将以单精度进行计算,然后转换为double进行存储。这不会获得额外的计算精度!
如果双精度值乘以末尾没有“D0”的常数会怎样? 这就像第一个问题一样,常量将提升为双精度,并以双精度进行计算。 但是,该常数仍然是单精度的,即使您像双精度常数一样写下了很多位,内部存储也是单精度的,无法表示该精度。例如,DoubleVar * 3.14159265359 将以双精度计算,但将以双精度计算近似于 DoubleVar * 3.14159。
如果希望编译器在常量中保留许多数字,则必须指定常量的精度。Fortran 90 的方法是根据您需要的任何精度来定义您自己的实际类型,例如,需要至少 14 位十进制数字:
integer, parameter :: DoubleReal_K = selected_real_kind (14)
real (DoubleReal_K) :: A
A = 5.0_DoubleReal_K
A = A * 3.14159265359_DoubleReal_K
Run Code Online (Sandbox Code Playgroud)