Fortran的长期投注

时间:2010-07-08 14:26:38

标签: loops fortran largenumber

我正在尝试处理大数(~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图书馆,人们会建议哪一个?

3 个答案:

答案 0 :(得分:8)

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

HUGE(num)不会返回kind=num的最大整数。 HUGE(num)也不会返回num字节中可表示的最大数字。虽然许多编译器对4字节和8字节整数使用integer(kind=4)integer(kind=8) ,但语言标准并不能保证这一点,并且不能依赖它是可移植的。< / p>

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

答案 1 :(得分:7)

我在Mac上使用的gfortran版本,4.3,4.4和4.5,支持8字节整数。在Fortran&gt; = 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: integer*4 vs integer(4) vs integer(kind=4)

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

答案 2 :(得分:0)

总结:考虑一下编译器选项。

自从我做完FORTRAN以来,这已经是一段时间了,而且我不记得使用HUGE(),但我看了一下。我的英特尔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

此外,当我将变量声明为整数* 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,但它可能有助于解释你所看到的结果。