Fortran: обработка целочисленных значений размера: ~ 700000000000 - PullRequest
7 голосов
/ 06 марта 2010

В настоящее время я совершенствую свои знания Fortran95 (не спрашиваю почему) ...

Я столкнулся с проблемой, хотя. Как обращаться с большими целыми числами, например размер: ~ 700000000000

INTEGER (KIND = 3) не может содержать этот номер. Если кому-то интересно, у меня есть компилятор Silverfrost FTN95.

Я использую целое число, чтобы просмотреть больший набор данных.

Есть ли у вас какие-либо предложения?

Ответы [ 6 ]

16 голосов
/ 06 марта 2010

Стандартное решение (начиная с Fortran 95, так что я предполагаю, что ваш компилятор его поддерживает) состоит в том, чтобы использовать SELECTED_INT_KIND, свойственный для проверки на допустимые целочисленные виды (значения которых зависят от компилятора) и HUGE intrinsic.

  • SELECTED_INT_KIND (R) возвращает параметр типа типа целочисленного типа, который представляет все целочисленные значения n с −10 ^ R
  • HUGE (K) возвращает наибольшее представимое число в целочисленном типе типа K.

Например, на моем Mac с процессором x86_64 ( gfortran компилятор, 64-битный режим), следующая программа:

  print *, selected_int_kind(1)
  print *, selected_int_kind(4)
  print *, selected_int_kind(8)
  print *, selected_int_kind(16)
  print *, selected_int_kind(32)
  print *, selected_int_kind(64)
  print *, huge(0_1)
  print *, huge(0_2)
  print *, huge(0_4)
  print *, huge(0_8)
  print *, huge(0_16)
  end

выводит:

           1
           2
           4
           8
          16
          -1
  127
  32767
  2147483647
  9223372036854775807
 170141183460469231731687303715884105727

, который говорит мне, что я буду использовать integer(kind=8) за вашу работу.

7 голосов
/ 06 марта 2010

Переносимый для объявления целочисленного «индекса», который будет иметь как минимум 12 десятичных цифр:

integer, parameter :: MyLongIntType = selected_int_kind (12)
integer (kind=MyLongIntType) :: index

"kind =" может быть опущено.

Использование определенных значений, таких как 3, полностью непереносимо и не рекомендуется. Некоторые компиляторы используют номера типов последовательно, другие используют количество байтов. «Selected_int_kind» вернет номер вида наименьшего целочисленного вида, доступного для компилятора, который может представлять это запрошенное количество цифр. Если такого типа не существует, -1 будет возвращено, и значение не будет выполнено, когда используется значение типа для объявления целого числа.

И gfortran, и ifort возвращают вид для десятичных цифр, введенных в selected_int_kind до 18. Большие значения, например 18, обычно выбирают 8-байтовое целое число с наибольшим положительным значением 9223372036854775807. Это имеет 19 цифр, но если компилятор поддерживает этот тип, но не более длинный, selected_int_kind (19) будет равен -1, поскольку не все 19-значные целые числа представимы.

6 голосов
/ 06 марта 2010

Существует несколько бесплатных библиотек произвольной точности , доступных для Fortran, которые могли бы решить эту проблему. FMLIB равен единице. Пять или шесть других вариантов связаны с этой страницы .

2 голосов
/ 06 марта 2010

Если вы используете его как переменную управления циклом, но не используете целое число напрямую (чего, я думаю, у вас нет, так как вы не можете объявить массив больше, чем представляемый самый большой индекс, верно?) тогда, я думаю, что нужно сделать, это разделить этого щенка на что-то вроде 100000 и поместить его цикл в другой цикл, который повторяется так много раз.

0 голосов
/ 06 марта 2010

Наш ответ на этот вопрос заключался в том, чтобы поместить значение в переменную двойной точности и сделать DINT, чтобы избавиться от дробных частей.Результатом является целое число, помещенное в переменную двойной точности.Функция DINT не всегда доступна для всех FORTRAN.Функция представляет собой целочисленную функцию двойной точности, которая позволяет получать очень большие целые числа (до 17 цифр).

0 голосов
/ 06 марта 2010

Вы пробовали INTEGER (KIND = 4)?

...