Fortran float изменяет значение целого числа - PullRequest
0 голосов
/ 10 января 2019

Я заметил ошибку в коде, который я использую, продемонстрированный следующим тестовым кодом:

PROGRAM test

implicit none


integer(kind=8):: i

i=17159401
print*,i,float(i)


end program test

Код выводит 17159401 17159400.0, тогда как он должен выводить 17159401 17159401.0

Я использую гфортран:

Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/apps/gcc/4.8.2/bin/../libexec/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-4.8.2/configure --prefix=/cm/shared/apps/gcc/4.8.2 --enable-languages=c,c++,fortran --with-gmp-include=/root/rpmbuild/BUILD/gcc-4.8.2-obj/../gcc-4.8.2/our-gmp --with-gmp-lib=/root/rpmbuild/BUILD/gcc-4.8.2-obj/../gcc-4.8.2/our-gmp --with-mpc-include=/root/rpmbuild/BUILD/gcc-4.8.2-obj/../gcc-4.8.2/our-mpc/src --with-mpc-lib=/root/rpmbuild/BUILD/gcc-4.8.2-obj/../gcc-4.8.2/our-mpc/src/.libs --with-mpfr-include=/root/rpmbuild/BUILD/gcc-4.8.2-obj/../gcc-4.8.2/our-mpfr/src --with-mpfr-lib=/root/rpmbuild/BUILD/gcc-4.8.2-obj/../gcc-4.8.2/our-mpfr/src/.libs
Thread model: posix
gcc version 4.8.2 (GCC) 

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 10 января 2019

Реальный тип по умолчанию не обладает достаточной точностью.

program test
  implicit none
  integer, parameter :: i10 = selected_int_kind(10)
  integer, parameter :: r15 = selected_real_kind(15)
  integer(kind=i10):: i
  real :: r
  real(kind=r15) :: s
  i=17159401
  r = i
  print *, 'default real kind: r', r, 'r+1', r+1, 'r-1', r-1
  s = i
  print *, 'r15 real kind: s', s, 's+1', s+1, 's-1', s-1
end program test

Вывод, который я получаю:

 default real kind: r   17159400.0     r+1   17159400.0     r-1   17159400.0    
 r15 real kind: s   17159401.000000000      s+1   17159402.000000000      s-1   17159400.000000000     

Приведенный выше результат означает, что 1 ниже точности переменных с плавающей запятой с типом по умолчанию. Я выбрал более точный вид (r15 здесь), который будет достаточно точным для ваших нужд во второй строке.

...