Fortran 77 Real到Int舍入方向?

Jzl*_*325 9 fortran rounding

移植一些Fortran 77代码.似乎REAL变量被分配给INTEGER变量.我没有运行此代码的方法,并想知道在以下情况下的行为是什么:

REAL*4 A
A = 123.25
B = INT(A)
Run Code Online (Sandbox Code Playgroud)

B = 123或B = 124?

在0.5分处怎么样?

REAL*4 C
C = 123.5
D = INT(C)
Run Code Online (Sandbox Code Playgroud)

D = 123或D = 123.5?

Ale*_*ogt 12

INT总是四舍五入下来:

海湾合作委员会文件:

这些函数根据以下规则返回INTEGER变量或数组:

(A)如果A的类型为INTEGER,则INT(A)= A.

(B)如果A是REAL类型和| A | <1,INT(A)等于0.如果| A |\geq 1,则INT(A)等于不超过A范围的最大整数,其符号与A的符号相同.

(C)如果A是COMPLEX类型,则规则B应用于A的实部.

如果要舍入到最接近的整数,请使用NINT.

所以,在你的情况下B,D总是123(如果它们被声明为integer).


pm2*_*m2r 9

这是代码和输出的一个示例,它是先前答案的扩展:

PROGRAM test
implicit none
integer               :: i=0
real                  :: dummy = 0.

do i = 0,30
       dummy = -1.0 + (i*0.1)
       write(*,*) i, dummy , int(dummy) , nint(dummy) ,floor(dummy)
enddo
stop
end PROGRAM test
Run Code Online (Sandbox Code Playgroud)

这是输出:

 $ ./test
      0  -1.000000              -1          -1          -1
      1 -0.9000000               0          -1          -1
      2 -0.8000000               0          -1          -1
      3 -0.7000000               0          -1          -1
      4 -0.6000000               0          -1          -1
      5 -0.5000000               0          -1          -1
      6 -0.4000000               0           0          -1
      7 -0.3000000               0           0          -1
      8 -0.2000000               0           0          -1
      9 -9.9999964E-02           0           0          -1
     10  0.0000000E+00           0           0           0
     11  0.1000000               0           0           0
     12  0.2000000               0           0           0
     13  0.3000001               0           0           0
     14  0.4000000               0           0           0
     15  0.5000000               0           1           0
     16  0.6000000               0           1           0
     17  0.7000000               0           1           0
     18  0.8000001               0           1           0
     19  0.9000000               0           1           0
     20   1.000000               1           1           1
     21   1.100000               1           1           1
     22   1.200000               1           1           1
     23   1.300000               1           1           1
     24   1.400000               1           1           1
     25   1.500000               1           2           1
     26   1.600000               1           2           1
     27   1.700000               1           2           1
     28   1.800000               1           2           1
     29   1.900000               1           2           1
     30   2.000000               2           2           2          
Run Code Online (Sandbox Code Playgroud)

我希望这可以更好地阐明问题

编辑:在xeon上与ifort 2013一起编译