Fortran: обработка целочисленных значений размера: ~700000000000

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

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

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

Я использую целое число для выполнения большего набора данных.

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

6 ответов


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

  • SELECTED_INT_KIND (R) возвращает параметр типа kind целочисленного типа, представляющий все целочисленные значения 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) для вашей работы.


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

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

"kind=" можно опустить.

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

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


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


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


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


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