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