fortran - 在主程序和函数中使用一致的精度

标签 fortran

以下小代码不起作用:

program main  
  implicit none
  integer, parameter :: dp=selected_real_kind(15)
  real(dp) :: v(9)  
  real(dp) :: vector_norm  
  v(:) = 3.14_dp
  print *, 'Vector norm = ', vector_norm(9,v)  
end program main  
      
 
function vector_norm(n,vec) result(norm)    
  integer, intent(in) :: n  
  real(dp), intent(in) :: vec(n)
  real(dp) :: norm
    
  norm = sqrt(sum(vec**2))  
end function vector_norm

在主程序中,我正在创建一个类型变量 dp,这样所有内容都是 double 的,我希望函数 vector_norm 也产生 double 结果。我知道我可以简单地使用 double precision function 而不是 function 语句。你们中的任何人都可以在继续使用 selected_real_kind 语句的同时帮助解决该错误。

注意:错误是“A kind type parameter must be a compile-time constant.”

最佳答案

有一个单独的module很方便定义精度,然后在整个代码中导入此模块以确保一致地使用精度。使用模块结构,您的代码将变为

module precision_module
  implicit none
  integer, parameter :: dp=selected_real_kind(15)
end module

module vector_norm_module
  use precision_module, only : dp
  implicit none
contains
  function vector_norm(n,vec) result(norm)    
    integer, intent(in) :: n  
    real(dp), intent(in) :: vec(n)
    real(dp) :: norm
    
    norm = sqrt(sum(vec**2))  
  end function vector_norm
end module

program main
  use precision_module, only : dp
  use vector_norm_module, only : vector_norm 
  implicit none
  real(dp) :: v(9)
  v(:) = 3.14_dp
  print *, 'Vector norm = ', vector_norm(9,v)  
end program main        

关于fortran - 在主程序和函数中使用一致的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70082046/

相关文章:

fortran - 如何将输出写入 Fortran 中的字符串?

fortran - Fortran 子例程参数列表中的星号 * 符号是什么意思?

integer - Fortran:处理大小的整数值:~700000000000

cmake - CMake 找不到 Fortran 模块文件

linux - 我想在 fortran 中编辑我的 fortran 生成的文件

fortran - 性能报告中的 __xl_pow、__xl_log、__xl_exp

c - 2014a 上的 Matlab C 网关和 Fortran 源混合 mex 函数

fortran - 将 WHERE 中的掩码应用于更高维度的数组

function - 在 `function` 语句中定义结果数据类型

module - 如何使用模块为 Fortran 程序创建 makefile