【问题标题】:Scientific notation in namelist with gfortran使用 gfortran 在名单中的科学记数法
【发布时间】:2014-11-03 10:58:14
【问题描述】:

我想通过名称列表从输入文件加载列表。为了编译,我使用 gfortran:

PROGRAM main

IMPLICIT NONE
INTEGER :: val,err
NAMELIST /myNamelist/ val

OPEN(100,file='input.txt')
READ(unit=100,nml=myNamelist,iostat=err)
CLOSE(100)

PRINT *, val

END PROGRAM

input.txt 如下所示:

&myNamelist
val = 3e3
/

程序打印一个 0 而不是 3000。如果我在输入文件中插入 val = 3000,它就可以工作。似乎 gfortran 不支持名称列表中的科学记数法。但是,使用 ifort 运行良好。是否有解决方法或在 gfortran 的名称列表中使用科学记数法?

【问题讨论】:

    标签: fortran gfortran


    【解决方案1】:

    你使用了iostat=err,但是你没有检查err的值!如果您这样做了,您会发现发生了错误情况并且err 不为零。所以val是没有用的。

    科学记数法对整数输入无效。要么读取real 变量,要么不使用科学计数法。

    试试:

    PROGRAM main
    
    IMPLICIT NONE
    INTEGER :: val,err
    character(256) :: msg
    NAMELIST /myNamelist/ val
    
    OPEN(100,file='input.txt')
    READ(unit=100,nml=myNamelist,iostat=err,iomsg=msg)
    CLOSE(100)
    
    PRINT *, err
    PRINT *, msg
    print *, val
    
    END PROGRAM
    

    运行:

    > sunf90 intnml.f90 
    > ./a.out 
     1083
     unexpected character in integer value                                           
    
    
    
     0
    

    顺便说一句,英特尔 Fortran 接受该值,但这是一个非标准扩展。如果您依赖它,您的程序将是不可移植的。

    【讨论】:

      【解决方案2】:

      我必须提交的 2008 年标准草案在第 10.11.3.3.6 段中在阅读名单的上下文中声明:

      当下一个有效项为整数类型时,输入中的值 记录被解释为一个具有合适的 Iw 编辑描述符 使用了 w 的值。

      在这种情况下,gfortran 所做的仅超出标准要求,而英特尔编译器更进一步并实现了一个扩展,以处理整数值的非标准形式,ie 3e3.

      【讨论】:

      • 这是一个扩展。被允许。我们允许将任何数字类型输入到列表导向或名单输入中的任何其他数字类型。 gfortran 和 ifort 都是正确的。这里的输入是非标准的,所以任何解释都是允许的。
      • 现在已修改答案以删除英特尔编译器上的中伤。
      猜你喜欢
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      相关资源
      最近更新 更多