4

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

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

我已经尝试过通常的星号kind=8等,但似乎没有任何效果。然后我检查了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 库,人们建议使用哪一个?

4

3 回答 3

9

我在 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,huge(1_LargeInt_K)输出9223372036854775807。当你写huge(1)等时,默认情况下常量是默认整数,这里显然是4字节,因为huge返回2147483647。所以有时你需要指定精度常量,而不仅仅是变量——更常见的是,当人们在一个默认为单精度的实数常量上丢失重要数字时,这会让他们绊倒。

另请参阅Fortran:integer*4 vs integer(4) vs integer(kind=4)

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

于 2010-07-08T15:03:53.943 回答
8

您误解了HUGE函数的精确定义。 HUGE(num)返回与 具有相同种类和类型的最大数num。返回的值也具有与 相同的种类和类型num。由于您的所有输入值都是(默认)整数HUGE,因此正确地返回最大的默认大小整数。

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

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

于 2010-07-08T15:15:06.423 回答
0

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

自从我完成 FORTRAN 以来已经有很长时间了,我不记得使用过 HUGE(),但我看了一点。我的 Intel Linux 机器有 gfortran 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

此外,当我将变量声明为 integer*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 

错误:整数对于 (1) 中的同类来说太大了

但是,当我使用 -fdefault-integer-8 选项编译时一切正常,我得到了一个打印的可执行文件

9223372036854775807

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

当然,这仍然不能让您获得 10^14,但它可能有助于解释您看到的结果。

于 2010-07-08T15:40:02.853 回答