Fortran 77 Real в направлении округления?

перенос немного кода Fortran 77. Похоже, что вещественные переменные назначаются целочисленным переменным. У меня нет метода для запуска этого кода и интересно, каково поведение в следующем случае:

REAL*4 A
A = 123.25
B = INT(A)

B = 123 или B = 124?

Как насчет отметки 0,5?

REAL*4 C
C = 123.5
D = INT(C)

D = 123 или D = 123.5?

2 ответов


INT всегда округления вниз:

С документация GCC:

эти функции возвращают целочисленную переменную или массив по следующим правилам:

(A) если A имеет тип INTEGER, INT(A) = a

(B) Если A имеет тип REAL и |A /

(C) если A имеет тип COMPLEX, правило B применяется к реальной части A.

если вы хотите округлить до ближайшего целого числа, использовать NINT.

Итак, в вашем случае B и D всегда 123 (если они объявлены как integer).


вот один пример кода и вывода, это расширение предыдущего ответа:

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

это выход:

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

Я надеюсь, что это может лучше прояснить вопрос

EDIT: скомпилирован с ifort 2013 на xeon