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

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

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

ЦЕЛОЕ ЧИСЛО (KIND=3) не может содержать это число. Если кому-либо интересно компилятор, я имею в наличии, Silverfrost FTN95.

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

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

7
задан ire_and_curses 5 March 2010 в 22:45
поделиться

6 ответов

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

  • SELECTED_INT_KIND (R) возвращает параметр типа вида целочисленного типа, который представляет все целочисленные значения n с -10^R < n < 10^R (и возвращает -1, если такого типа не существует).
  • 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).

16
ответ дан 6 December 2019 в 05:55
поделиться

Переносимый для объявления целочисленного «индекса», который будет иметь не менее 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-значные целые числа представимы.

7
ответ дан 6 December 2019 в 05:55
поделиться

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

6
ответ дан 6 December 2019 в 05:55
поделиться

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

2
ответ дан 6 December 2019 в 05:55
поделиться

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

0
ответ дан 6 December 2019 в 05:55
поделиться

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

0
ответ дан 6 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: