Как установить тип Fortran Integer

program PEU3
integer(kind=7) :: num = 600851475143
integer(kind=7) :: pf, counter 

Это часть моего кода на Фортране. Число очень велико, поэтому я попытался установить для него вид = 7, но по какой-то причине он все еще выдает ошибку 217 — целое (вид = 3) константа вне диапазона для строки, объявляющей число, хотя я объявил, что это число должно быть добрым 7. Я занимался этим некоторое время и не могу понять, почему это не работает. Помощь будет большой признательна. Моя IDE — Plato с компилятором silverfrost, если это уместно.


person L5RK    schedule 17.08.2018    source источник
comment
С жестко запрограммированным kind=7 вам гарантировано, что ваш ode не будет скомпилирован практически любым другим компилятором. Пожалуйста, не используйте магические константы для добрых чисел, см. stackoverflow.com/questions /838310/fortran-90-вид-параметр   -  person Vladimir F    schedule 19.08.2018


Ответы (1)


Обратите внимание на ошибку «Константа вне диапазона», а не «Переменная вне диапазона». Константа в строке

integer(kind=7) :: num = 600851475143

является фактическим числом: 600851475143. По умолчанию ваш компилятор, кажется, хочет хранить константы как 32-битные целые числа, и это число слишком велико для этого.

Самым простым решением было бы указать компилятору хранить эту константу в том же виде, что и num, так что что-то вроде этого:

integer(kind=7) :: num = 600851475143_7

Это завершающее подчеркивание указывает компилятору хранить константу как целое число типа 7.

НО

Я должен указать, что какое число соответствует какому типу, зависит от компилятора и машины. Это значит, что код нельзя было бы легко передать.

Поэтому, пожалуйста, используйте одну из этих конструкций:

Для более новых компиляторов (совместимых с Fortran 2008) используйте встроенный модуль iso_fortran_env:

program PEU3
    use iso_fortran_env, only: int64
    implicit none
    integer(kind=int64) :: num = 600851475143_int64

Для более старых компиляторов вы можете использовать метод selected_int_kind, чтобы найти лучший целочисленный тип. Он принимает один параметр: максимальное количество цифр (по основанию 10) для хранения. (Хотя технически, если вы передадите ему число 12, это гарантирует только числа между -10^12 ... 10^12, поэтому вам нужно будет передать 13, чтобы быть уверенным, что ваш номер может быть сохранен.)

integer, parameter :: largeint = selected_int_kind(13)
integer(kind=largeint) :: num = 600851475143_largeint

Оба эти метода легче читаются и не зависят от компилятора, поэтому их гораздо легче портировать на новую систему.

person chw21    schedule 17.08.2018
comment
Я набрал это: целое число, параметр :: my_kind = selected_int_kind (13) integer (kind = my_kind) :: pf, counter, st pf = 0 num = 600851475143, однако я все еще получаю ту же ошибку: 217 в строке присвоение номера - person L5RK; 17.08.2018
comment
В такой ситуации всегда стоит просто проверить значение, которое возвращает selected_int_kind(13). - person High Performance Mark; 17.08.2018
comment
Извините, я очень новичок. Как бы я это сделал? - person L5RK; 17.08.2018
comment
Я обновил свой ответ, посмотрите эту короткую программу, которую вы можете скопировать, скомпилировать и запустить. - person chw21; 17.08.2018
comment
Подождите, а возможно ли, что ему нужно написать integer(kind=my_kind) :: num=600851475143_my_kind? - person chw21; 17.08.2018
comment
Да, последний сработал. Просто чтобы лучше знать язык, зачем это было нужно и всегда ли это применимо? - person L5RK; 17.08.2018
comment
Я полностью переписал свой ответ, пожалуйста, проверьте, довольны ли вы им. - person chw21; 17.08.2018