我正在尝试处理大数字(~10^14),并且我需要能够存储它们并迭代该长度的循环,即

n=SOME_BIG_NUMBER
do i=n,1,-1

我尝试过通常的星号表示法, kind=8 ETC。但似乎没有任何作用。然后我检查了 huge 内在函数和代码:

program inttest

print *,huge(1)
print *,huge(2)
print *,huge(4)
print *,huge(8)
print *,huge(16)
print *,huge(32)

end program inttest

在所有情况下都会生成数字 2147483647。为什么是这样?我在 64 位机器上使用 gfortran (f95)。

如果我需要一个 bignum 库,人们会推荐哪一个?

有帮助吗?

解决方案

我在mac上使用的gfortran版本,4.3,4.4和4.5,支持8字节整数。在Fortran>= 90中选择变量类型的最佳方法是使用内部函数来指定所需的精度。尝试:

integer, parameter :: LargeInt_K = selected_int_kind (18)
integer (kind=LargeInt_K) :: i, n
.

以获得至少18位十进制数字,这通常是8字节整数。

与gfortran 4.3,巨大(1_largeint_k)输出9223372036854775807.当您写巨大(1)等时,默认情况下,常量是一个默认的整数,这里显然是4字节,因为大幅返回2147483647.因此,有时您需要指定常量的精度,而不仅仅是变量 - 更常见的是,当他们在真实常量丢失有效的数字时,这是越来越多的人,这默认为单精度。

还看到 fortran:整数* 4 vs整数(4)vs整数(种类= 4)

通常gfortan有命令名称gfortran。 F95可以是一个不同的编译器吗?尝试“gfortran -v”和“f95 -v”。

其他提示

你误解了它的精确定义 HUGE 功能。 HUGE(num) 返回具有相同种类和类型的最大数字 num. 。返回的值也具有相同的种类和类型 num. 。由于所有输入值都是(默认)整数 HUGE, 正确地返回最大的默认大小整数。

HUGE(num) 不返回最大整数 kind=num. 。也没有 HUGE(num) 返回可表示的最大数字 num 字节。虽然许多编译器使用 integer(kind=4)integer(kind=8) ETC 对于 4 字节和 8 字节整数,语言标准不保证这一点,并且不能依赖其可移植性。

@MSB 的答案告诉你如何做你想做的事,我只是插话一些澄清。

摘要:考虑查看编译器选项。

自从我完成Fortran以来是一个L-O-N-G的时间,我不记得使用巨大(),但我看了一下。我的英特尔Linux机器有GONOTRAN 4.1.2。我发现我必须使用-fdefault-integer-8选项编译,以使其工作为64位整数。具体来说,使用此代码:

      program inttest
      print *, huge(1)
      end program inttest
.

运行

$ gfortran Inttest.for

创建了一个打印的可执行文件:

2147483647

但是,运行:

$ gfortran -fdefault-integer-8 Inttest.for

导致可执行文件,其给出输出:

9223372036854775807

还,当我声明一个变量作为整数* 8并且没有-fdefault-integer-8选项编译时,我收到错误。代码:

  program inttest2
  integer*8  test_int
  test_int = 9223372036854775807
  print *, test_int
  end program inttest2
.

运行

$ gfortran Inttest2.for

导致

文件Inttest.for:4

  test_int = 9223372036854775807  
                               1 
.

错误:Integer在(1)

中的种类太大了
但是,当我使用-fdefault-integer-8选项编译时,事项运行正常,我得到了打印

的可执行文件

9223372036854775807

也许还有其他GONTRAN选项是有用的,但我没有进一步调查。

授予,这仍然没有得到10 ^ 14,但它可能有助于解释你看到的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top