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
всегда округления вниз:
эти функции возвращают целочисленную переменную или массив по следующим правилам:
(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