【发布时间】:2015-03-06 21:57:27
【问题描述】:
在 Fortran 中,涉及integer 和real 操作数的算术运算是否总是通过将整数操作数转换为与实数操作数相同类型的实数来执行?还是有什么例外?
【问题讨论】:
标签: fortran
在 Fortran 中,涉及integer 和real 操作数的算术运算是否总是通过将整数操作数转换为与实数操作数相同类型的实数来执行?还是有什么例外?
【问题讨论】:
标签: fortran
这是在 Ch. 中定义的。 7.1.5.1Fortran 2008 Standard的“内在运算分类”:
摘自注释 7.15:
Intrinsic operator Type of Type of Type of op x1 x2 [x1] op x2 ---------------------------------------------------------- I I, R, Z I, R, Z Binary +, –, *, /, ** R I, R, Z R, R, Z Z I, R, Z Z, Z, Z[...]
注意:符号 I、R、Z、C 和 L 代表整数、实数、 分别是复杂的、字符的和逻辑的。哪里不止一个 给定 x 2 的类型,运算结果的类型是 在下一列中以相同的相对位置给出。
所以是的,在你的情况下它被转换为real。
【讨论】:
是的,对于内部算术运算符,涉及整数和实数操作数的表达式的结果类型总是与实数操作数相同类型的实数。
【讨论】:
两个答案都说明了一些重要的事情:结果是 real 类型(表达式中带有实数的 kind 参数)。
不过还是少了点什么。是:整数首先转换为结果的实数(带 kind 参数)。从 7.1.5.2.1
除了一个整数幂的值,如果操作数有不同的类型或种类类型参数,效果就像每个在类型或种类类型参数上与结果不同的操作数都转换为类型和运算前结果的 kind 类型参数。当一个实数或复数类型的值的整数幂时,整数操作数不需要转换。
所以以下是等价的(因为后者是这种转换的定义方式)
1+1._wp
real(1,wp)+1._wp
该段落还为您提供了该问题的例外情况。 5._wp**1 是涉及不需要转换的整数操作数的算术。
作为进一步的例外,以上仅涵盖内在操作(由Alexander Vogt's answer 给出)。可以想象定义不受这些规则约束的算术运算。
顺便说一句,两个示例(它们非常特定于实现,但仍然可以指示要寻找的有趣功能)。
print*, 16777219+2., REAL(16777219+2)
print*, (1.000001)**16777219, (1.000001)**REAL(16777219)
在我查看的一个实现中,对于每一行,两个表达式都返回不同的结果,但所有结果都是默认真实的。
对于第一个,知道结果是real 类型是不够的,但是我们知道如果第二个结果与执行整数转换的效果不同,编译器是不允许返回第二个结果的第一的。 [这确实是一个糟糕的例子,算术的解释也取决于处理器。]
对于第二个,将整数转换为实数可能会产生与非整数不同的结果。
【讨论】: