fortran - 在 Fortran 中定义指数

标签 fortran precision intel-fortran

我的代码中的变量精度遇到了一些问题...... 一段时间以来,我一直将变量声明为 real(kind=8) :: var我现在明白这不是很便携并且有一些其他复杂性,但基本上我在数值计算中遇到了很多不精确的情况。

现在我正在使用:

INTEGER,  PARAMETER :: R8 = SELECTED_REAL_KIND (30, 300)
with variable declaration: real(R8) :: var1,var2.

之前我通常将变量初始化为 var1 = 1.0D0现在我正在使用var1 = 1.0_R8但我该怎么办 var1 = 1.0D-20 ?我运行了一个简单的代码,证明 1.0D-20不会给我准确的结果,但类似 ​​10.0_r8**(-20.0_r8)将要。有没有更简单的方法来定义变量?我知道1D-20非常小,但我使用的代码确实需要 30 位小数点精度。

感谢您的帮助!

最佳答案

这里确实发生了两件事。首先,使用d表示法声明指数与将其声明为 double 类型相同。

其次,您声明的 r8 变量需要比大多数(全部?)8 字节表示形式更高的精度。因此,您实际上将大部分变量声明为四元,然后将它们初始化为双元,这就是问题的根源。

正如评论中提到的,您明确问题的答案是使用以下符号声明指数

real(mytype) :: a = 1.23e-20_mytype

这种表示法很麻烦,但对于常量声明来说很容易习惯。

这是我用来测试您的类型的一些示例代码:

program main
   use ISO_FORTRAN_ENV, only : REAL64 => REAL64, REAL128
   implicit none

   INTEGER,  PARAMETER :: R8 = SELECTED_REAL_KIND (30, 300)
   real(r8) :: x, y, z
   real(REAL64) :: a, b, c

   x = 1.23d-20
   y = 1.23e-20_r8
   z = 1.23_r8*(10._r8**-20)

   write(*,*) x
   write(*,*) y
   write(*,*) z


   a = 1.23d-20
   b = 1.23e-20_REAL64
   c = 1.23_REAL64*(10._REAL64**-20)

   write(*,*) a
   write(*,*) b
   write(*,*) c

   write(*,*) 'Types: ', REAL64, R8, REAL128

end program main

对于英特尔 16.0,这给出:

mach5% ifort main.f90 && ./a.out
  1.230000000000000057423043720037598E-0020
  1.230000000000000000000000000000000E-0020
  1.230000000000000000000000000000002E-0020
  1.230000000000000E-020
  1.230000000000000E-020
  1.230000000000000E-020
 Types:            8          16          16

关于fortran - 在 Fortran 中定义指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47337262/

相关文章:

c++ - C++ 中的 std::complex<double> 与具有链接时优化的 gcc 6 下 Fortran 中的 complex*16 之间的类型不匹配

c - 如何使用 Fortran 接口(interface)调用包含用户定义类型的 C 函数

Python Decimal 给出不正确的结果

可能导致精度或幅度损失的 Java 隐式转换?

qt - 如何设置精度和对齐方式以在 QTableView 中显示数值

Fortran final 例程在变量超出范围之前调用自身

fortran - 在 FORTRAN 中定义文件路径

linux - Sublime Text 2 构建 (Ctrl +B) 英特尔 Fortran 编译器

arrays - 将未知大小的数组(子例程输出)传递给另一个子例程

visual-studio-code - 带有 Intel Fortran 调试器的 VSCode : debugging window doesn't show allocatable variables