如何确保 gfortran 和 ifort 编译器的精度相同?对于复杂函数,要具体 [重复]

How to ensure same precision from gfortran and ifort compiler? For complex functions, to be specific [duplicate]

提问人:ZeroTwo 提问时间:10/20/2023 更新时间:10/20/2023 访问量:59

问:

我正在使用以下代码(文件名cf.f90)在输出文件中写入一些复杂函数的值。我从 gfortran 和 ifort 编译器获得不同的输出(我使用 和gfortran -O3 -o cf.exe cf.f90ifort -O3 cf.f90 -o cf.exe)

program complex_func
  IMPLICIT  NONE
  integer, parameter :: dp = selected_real_kind(15, 307)
Real(dp) x
complex(dp) CF

x = 0.7
call complex_example(x, CF)

end program complex_func


Subroutine complex_example(y, my_CF)

  Implicit None
  integer, parameter :: dp = selected_real_kind(15, 307)
  Real(dp) y
  Complex(dp) my_CF, my_CF2, val(3), sumval(3)
  complex(dp), parameter :: I = (0.0_dp, 1.0_dp)  ! sqrt(-1)
  my_CF = (I+1) * exp(I*y) / y

  val = [my_CF, my_CF, (0.0_dp, 0.0_dp)]
 
  write(*,*) 'adding complex array :'
  sumval = val + val
  write(*,*) sumval
  
  return
  
end Subroutine complex_example

gfortran 的输出是

adding complex array :
              (0.34464148256663812,4.0258854202296295)              (0.34464148256663812,4.0258854202296295)               (0.0000000000000000,0.0000000000000000)

而从 Ifort 是

adding complex array :
              (0.344641482566638,4.02588542022963)              (0.344641482566638,4.02588542022963)               (0.0000000000000000,0.0000000000000000)

从 gfortran 开始,它是 16 位十进制数字,从 ifort 开始,我得到的是第 14 位数字。如何确保我从 ifort 获得相同的精度?

额外信息:我在更大的代码中使用了复杂的函数,我从 gfortran 而不是 ifort 的代码中获得了预期的结果。

Fortran Gfortran Intel-Fortran

评论

2赞 francescalus 10/20/2023
如果你的输出中有 N 个十进制数字,请要求 N 个十进制数字,而不是对编译器说“给我你喜欢的输出”。
3赞 francescalus 10/20/2023
链接的问题侧重于实际输出而不是复杂的输出。这里的区别在于你如何指定格式,但主要结果是相同的:你不能依赖列表导向的输出。
2赞 francescalus 10/20/2023
复数的列表导向输出处理漂亮的形式。如果需要保留具有显式格式的括号,则需要手动执行此操作(1.00, 0.00)

答: 暂无答案