我正在尝试处理大数(~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图书馆,人们会建议哪一个?
答案 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,但它可能有助于解释你所看到的结果。