在Fortran中,通过将整数操作数转换为与实数操作数相同类型的实数值来执行涉及integer
和real
操作数的算术总是 ?或者有任何例外吗?
答案 0 :(得分:4)
这在Ch。中定义。 7.1.5.1 Fortran 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
。
答案 1 :(得分:2)
是的,对于内部算术运算符,涉及整数和实数操作数的表达式的结果类型总是与实数操作数相同。
答案 2 :(得分:1)
两个答案都说了一些重要的事情:结果是real
类型(表达式中带有real的kind参数)。
但是有些东西不见了。是:首先将整数转换为结果的实数(带有种类参数)。从7.1.5.2.1
除了提升为整数幂的值之外,如果操作数具有不同的类型或种类类型参数,则效果就好像每个操作数的类型或种类类型参数与结果的操作数不同,将转换为类型和执行操作之前结果的类型参数。当real或complex类型的值被提升为整数幂时,不需要转换整数操作数。
所以以下是等价的(因为后者是如何定义这种转换)
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
是不够的,但我们知道如果编译器与执行转换的效果不同,则不允许编译器返回第二个结果。整数首先。 [这是一个很糟糕的例子,对算术的解释也依赖于处理器。]
对于第二个,将整数转换为实数可能会产生不同的结果。