指定Integer Precision gfortran

时间:2014-07-20 17:29:39

标签: floating-point 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 个答案:

答案 0 :(得分:2)

这是this recent question的近乎重复,所以我应该投票结束,但又来了,

在表达式2**31中,231都是默认整数,很可能是32位整数。在将结果赋给n之前,编译器将根据32位整数的规则将它们相乘,然后溢出。如果这不是你想要的行为,要么摆弄编译器选项(不好推荐),要么明确设置文字值的种类(更好):

n = 2_long**31_long

(实际上,您不需要同时制作231 long个整数,但这不会造成任何伤害。)