Я решил изучить язык fortran95 (причина, почему это не важно). Однако, будучи новичком, я столкнулся с странной проблемой, которую я действительно не могу объяснить, поэтому мне нужна помощь.fortran 95 округление на своем собственном
У меня есть алгоритм вставки сортировки:
subroutine insertion_sort_REAL4(array, array_len)
implicit none
!parameners
integer :: array_len
real (kind=4), dimension(array_len) :: array
!variables
integer :: i,key,hole_pos
do i = 0,array_len
key = array(i)
hole_pos = i;
do while ((hole_pos > 0.0) .and. (key < array(hole_pos - 1)))
array(hole_pos) = array(hole_pos - 1)
hole_pos = hole_pos - 1
end do
array(hole_pos) = key
end do
return
end
И есть основная программа (выдержка):
real (kind = 4), dimension(3) :: x
x(1) = 3.1
x(2) = 4.3
x(3) = 5.4
write(*,*) 'Array = ',x
call insertion_sort_REAL4(x,3)
write(*,*) 'Array = ',x
Первые write
заявление распечатывает
Array = 3.09999990 4.30000019 5.40000010
Почему цифры немного изменились? По умолчанию fortran95 не использует стандарт IEEE754?
Но скажем, я могу жить с небольшими изменениями; вторые write
заявления распечатывает
Array = 3.00000000 4.00000000 5.00000000
Почему цифры округлены до? Это действительно раздражает меня, и форматирование заявления «писать» не приносит пользы, и поиски Google не помогли. Я предполагаю, что в интернете не так много вещей о fortran, как о C. Я - достойный программист на C, поэтому любые параллели с ним оцениваются. Спасибо вам за помощь!
Это то время дня снова. Обязательная ссылка: [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – ppeterka
в этом случае, однако он не делает любая плавающая арифметика. Значения будут точно сохранены (если бы не для непреднамеренного преобразования типа.) – agentp