【问题标题】:With fortran PGI compiler, why is real(.true.) equal to "-1.0" and int(.true.) equal to "-1"?使用 fortran PGI 编译器,为什么 real(.true.) 等于“-1.0”而 int(.true.) 等于“-1”?
【发布时间】:2019-05-13 14:46:44
【问题描述】:

我刚刚发现了这个可爱的事实。显然Visual Basic 也是如此……也许答案是相似的?也许它也适用于其他语言?

编辑

显然这只适用于某些编译器——在我的例子中,使用pgf90 PGI 编译器。它不适用于gfortran

【问题讨论】:

    标签: fortran fortran90


    【解决方案1】:

    这 (int(.true.)==-1) 不是真的。好吧,至少不是一般的。

    首先,您不应使用逻辑参数调用int()。但是您的编译器可能允许它作为扩展。

    > gfortran realinttrue.f90 
    realinttrue.f90:1:13:
    
     print *,real(.true.), int(.true.)
                 1
    Error: ‘a’ argument of ‘real’ intrinsic at (1) must have a numeric type
    realinttrue.f90:1:26:
    
     print *,real(.true.), int(.true.)
                              1
    Error: ‘a’ argument of ‘int’ intrinsic at (1) must have a numeric type
    

    也许你的意思是这样的:

    print *, transfer(.true.,1)
    end
    

    无论如何,唯一可以保证的是有两个不同的值,TRUE 和 FALSE。它们在内存中的样子取决于编译器。有两个明显的选择。将所有位设置为 1,将第一位设置为 1。第一个是-1的整数值,另一个是+1。

    例如上面的代码

    > ifort trueint.f90 
    > ./a.out 
              -1
    > ifort trueint.f90 -standard-semantics
    > ./a.out 
     1
    > gfortran trueint.f90
    > ./a.out 
               1
    

    对于real,情况更加复杂。我不知道您是如何获得结果的。

    【讨论】:

    • 谢谢。我正在使用PGI compilerpgf90,现在添加到问题中。我猜real 结果是该编译器独有的——使用transfer() 时我得到NaN,但使用real()dble() 时得到-1
    • 对于 GFortran,请参阅 gcc.gnu.org/onlinedocs/gfortran/…
    猜你喜欢
    • 2014-07-04
    • 2013-01-05
    • 2016-09-17
    • 1970-01-01
    • 2014-02-16
    • 2021-10-08
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多