В настоящее время я повторяю на своем знании Fortran95 (не спрашивайте почему)...
Я работаю в к проблеме все же. Как делает один дескриптор большие целые числа, например, размер: ~700000000000
ЦЕЛОЕ ЧИСЛО (KIND=3) не может содержать это число. Если кому-либо интересно компилятор, я имею в наличии, Silverfrost FTN95.
Я использую целое число для пробежки большего набора данных.
У Вас есть какие-либо предложения?
Стандартным решением (начиная с 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)
.
Переносимый для объявления целочисленного «индекса», который будет иметь не менее 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 не всегда доступна во всех FORTRAN. Эта функция является целочисленной функцией двойной точности, что позволяет использовать очень большие целые числа (до 17 цифр).