【问题标题】:Numerical equivalent of TRUE is -1?TRUE 的数值等价物是 -1?
【发布时间】:2016-09-12 15:56:48
【问题描述】:

我在 Visual Studio 2012 中使用 Intel Fortran 来编译 Fortran 代码。 当我尝试使用逻辑运算符时,我注意到独立的逻辑表达式会按预期产生 T 或 F。但是,如果我需要数字 T 或 F(0 或 1),当逻辑结果为 T 时,我会得到 -1。

例如:

integer*4 a
a = 1
logicval = (node(5,L).gt.0)
numval =  1*(node(5,L).gt.0)
write(*,*) logicval, numval

会输出

T,-1

有没有一种方法可以重新定义分配给 T & F 的数值?

【问题讨论】:

  • 请注意,没有 Visual Studio Fortran。 Fortran 编译器有多家供应商,但最常见的是英特尔。
  • @VladimirF 我正在使用英特尔 FORTRAN 并使用 Visual Studio 作为 IDE。我应该进行编辑以使其更清晰。

标签: visual-studio visual-studio-2012 fortran logical-operators intel-fortran


【解决方案1】:

是的,预计英特尔 Fortran 的 TRUE 确实是 -1,因为所有位都设置为 1。

此外,您将整数用作逻辑(布尔)变量是完全不标准的。你应该让你的代码长几行,并且总是做正确的转换。您的 integer_var = 1*(node(5,L).gt.0) 在 Fortran 中是不允许的,它将被许多编译器拒绝。如果你放弃1*,gfortran 会发出警告,但你的表单会导致错误。


您可以简单地以符合标准的方式转换您的逻辑和整数

   if (l) then
     x = 1
   else
     x = 0
   end if

您可以使用 MERGE() intrisic 或使用 WHERE 轻松地将 Fortran 逻辑数组转换为具有 1 和 0 的整数数组。


英特尔 Fortran 的一个简单修复可能是英特尔 Fortran 的 -fpscomp logicals,它将LOGICAL 类型的处理切换为将任何非零值视为真,并使@​​987654328@ 常量等于整数 1。

仍然要小心,因为它不会使您的程序具有可移植性,它只能解决一个特定编译器中的一个可移植性问题。


您可以使用 C 可互操作逻辑类型将定义与英特尔 C 表示相匹配:

use iso_c_binding

logical(c_bool) :: variable

这些将具有 +1 和 0 的值,因为 C99 对 _Bool 的规定。如果您需要它们与int 互操作,您必须进行一些简单的转换。 C_intc_bool 不兼容。

根据英特尔编译器的版本,您可能需要使用-standard-semantics(或-fpscomp logicals)来获得正确的logical(c_bool)。我认为这是非常不幸。

【讨论】:

  • 这很全面,对我来说也很有用。非常感谢!
  • 不幸的是,这是另一种情况,其中新标准指定的行为与长期存在的实践相冲突。 Intel Fortran 源自 DEC Fortran,它早在 1970 年代就采用了 LOGICAL 的偶/奇实践,这对于 VAX 硬件的测试非常有用(它有一个低位分支清除/设置指令对)和解释 VMS 条件值。直到 Fortran 2003 标准才对 LOGICAL 类型的表示作了任何说明,而且只是间接地说明了这一点。我认为不幸的是包含 LOGICAL 作为可互操作的类型。
  • @SteveLionel 我只是认为可互操作的类型可能与默认类型具有不同的表示形式,并且不需要任何标志。
  • @VladimirF,我想这是可能的,但为了有限的利益而实施是一件非常复杂且成本高昂的事情。由于英特尔 Fortran 有其他不同于标准的默认值,因此 -standard-semantics 会处理所有这些默认值。
【解决方案2】:

正如其他人所说,这种非标准用法的英特尔 Fortran 默认设置是设置低位(奇数)的整数值为真,偶数值(低位清除)为假。常数.TRUE。位模式为 -1。当您进行转换时,它会变得更加复杂,直到版本 17,编译器在这方面并没有完全一致。请注意,如果您使用 -standard-semantics,则隐含 -fpscomp 逻辑。

请阅读 https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/275071#comment-1548435 以及第 17 版发行说明 (https://software.intel.com/en-us/articles/intel-fortran-compiler-170-release-notes),了解有关该版本中如何处理数字逻辑转换的更改的信息。

【讨论】:

  • 非常感谢。您的链接帖子非常有帮助。顺便说一句,您在英特尔网站上的回答/帖子非常有帮助,并且在多个场合都对我有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2015-08-21
  • 2021-04-03
相关资源
最近更新 更多