Укажите Integer Precision gfortran
Я работаю с целыми числами больше 2^31-1, и поэтому я пытаюсь установить точность моих целочисленных переменных на более высокое значение. Метод, который я считал правильным, был
PROGRAM f1
IMPLICIT NONE
INTEGER,PARAMETER :: LONG = SELECTED_INT_KIND(15)
INTEGER(KIND=LONG) :: n
n=2**31
END PROGRAM f1
что, как я понимаю, должно позволять n
быть в [-10^15, 10^15]. Однако приведенный выше код выдает ошибку компилятора, используя gfortran 4.6, а именно
n=2**31
1
Error: Arithmetic overflow at (1)
Я пытался заменить линию бедствия на n=int8(2**31)
но безрезультатно. Любые рекомендации?
1 ответ
Это почти дубликат этого недавнего вопроса, поэтому я, вероятно, должен проголосовать, чтобы закрыть, но здесь снова
В выражении 2**31
и то и другое 2
а также 31
являются целыми числами по умолчанию, скорее всего, 32-разрядными целыми числами. Компилятор умножит их в соответствии с правилами для 32-разрядных целых чисел и переполнит, прежде чем присваивать результат n
, Если это не то поведение, которое вы хотите, либо возитесь с параметрами компилятора (плохая рекомендация), либо четко установите тип для литеральных значений (лучше):
n = 2_long**31_long
(На практике вам не нужно делать оба 2
а также 31
long
целые числа, но это не вредит.)