Fortran 77 Real to Int rounding Direction?

INT is always rounding down:

From the GCC documentation:

These functions return a INTEGER variable or array under the following rules:

(A) If A is of type INTEGER, INT(A) = A

(B) If A is of type REAL and |A| < 1, INT(A) equals 0. If |A| \geq 1, then INT(A) equals the largest integer that does not exceed the range of A and whose sign is the same as the sign of A.

(C) If A is of type COMPLEX, rule B is applied to the real part of A.

If you want to round to the nearest integer, use NINT.

So, in your case B and D are always 123 (if they are declared as integer).


Here is one example of code and the output, it's an extension of previous answer:

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

This is the output:

 $ ./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          

I hope that this can better clarify the question

EDIT: Compiled with ifort 2013 on xeon