Помогите! Передача целых чисел FORTRAN превращает их в неточные числа? - PullRequest
1 голос
/ 12 декабря 2010

Когда я создаю скалярный INTEGER s и передаю его подпрограмме, его значение преобразуется в число с плавающей точкой и ужасно неточно. Например, если я установлю s = 2 и CALL print_my_int (s), где он будет записывать (, ) его в консоль, его значение будет отображаться как 2.80259693E-45. Другие скалярные целые числа ведут себя аналогично, за исключением случая, когда s = 0, и в этом случае выходной результат равен 0,0000000. Но даже это все равно неправильно, поскольку целое число, очевидно, не должно отображать десятичную и мантиссу. Это НЕ проблема с выходным форматом, так как я могу заставить другие целые числа правильно отображаться при локальном отображении.

Есть хоть какой-то ключ к пониманию того, что здесь происходит? Нужно ли принудительно указывать тип данных аргумента в определении подпрограммы? Можно ли это сделать?

Пример кода:

PROGRAM print_int
   INTEGER  s
   s = 2
   CALL print_my_int(s)
END PROGRAM print_int

SUBROUTINE print_my_int(x)
   WRITE(*,*) x
END SUBROUTINE print_my_int

Результирующий вывод:

2.80259693E-45

Ответы [ 3 ]

3 голосов
/ 13 декабря 2010

Еще один расширенный комментарий, еще более простой, чем у @ steabert's:

PROGRAM print_int
   INTEGER  s
   s = 2
   CALL print_my_int(s)

CONTAINS

SUBROUTINE print_my_int(x)
   WRITE(*,*) x
END SUBROUTINE print_my_int

END PROGRAM print_int

Содержа подпрограмму в программе, вы заставляете компилятор создавать явный интерфейс, сохраняя 3 строки кода.Оставляя объявление x внутри подпрограммы неявным, компилятор обнаруживает ошибку.

2 голосов
/ 12 декабря 2010

Ничего нового, просто хотел указать на использование интерфейса, предоставив код, который не помещался в комментарии:

Как уже говорилось, вы можете поместить implicit none везде в начале раздела объявления, или же вы можете поместить интерфейс в вашу программу, которая использует подпрограмму, тогда компилятор выдаст ошибку несоответствия типов:

PROGRAM print_int
INTERFACE
    SUBROUTINE print_my_int(x)
    END SUBROUTINE
END INTERFACE
INTEGER  s
s = 2
CALL print_my_int(s)
END PROGRAM print_int

SUBROUTINE print_my_int(x)
WRITE(*,*) x
END SUBROUTINE print_my_int
1 голос
/ 12 декабря 2010

Хорошо, преждевременный пост, но я оставлю его для всех, кто сталкивается с тем же. Я не привык к синтаксису для принудительного применения типов параметров в FORTRAN. В определении подпрограммы тип данных параметра находится ниже списка имен и параметров. Если не включен, компилятор GNU не предупреждает и не кричит. Я предполагаю, что это приводит его к другому типу по умолчанию. Итак, мой приведенный выше пример должен выглядеть следующим образом ...

PROGRAM print_int
   INTEGER  s
   s = 2
   CALL print_my_int(s)
END PROGRAM print_int

SUBROUTINE print_my_int(x)
   INTEGER  x
   WRITE(*,*) x
END SUBROUTINE print_my_int
...