题
我正在尝试处理大数字(~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
导致
但是,当我使用-fdefault-integer-8选项编译时,事项运行正常,我得到了打印的可执行文件文件Inttest.for:4
.test_int = 9223372036854775807 1
错误:Integer在(1)
中的种类太大了
9223372036854775807
也许还有其他GONTRAN选项是有用的,但我没有进一步调查。
授予,这仍然没有得到10 ^ 14,但它可能有助于解释你看到的结果。