Loops Fortran中的长整数
我正在尝试处理大量的数据(~10^14),我需要能够存储它们并迭代该长度的循环,即Loops Fortran中的长整数,loops,fortran,largenumber,Loops,Fortran,Largenumber,我正在尝试处理大量的数据(~10^14),我需要能够存储它们并迭代该长度的循环,即 n=SOME_BIG_NUMBER do i=n,1,-1 我试过常用的星形符号,kind=8等等,但似乎什么都不起作用。 然后我检查了巨大的内在函数,代码: program inttest print *,huge(1) print *,huge(2) print *,huge(4) print *,huge(8) print *,huge(16) print *,huge(32) end program
n=SOME_BIG_NUMBER
do i=n,1,-1
我试过常用的星形符号,kind=8
等等,但似乎什么都不起作用。
然后我检查了巨大的
内在函数,代码:
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库,人们会推荐哪一个?我使用的gfortran版本,Mac上的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。因此,有时您需要指定常量的精度,而不仅仅是变量——更常见的是,当人们在实际常量上丢失有效数字时,这会使人感到困惑,而实际常量默认为单精度
也看到
通常gfortran具有命令名gfortran。f95可以是不同的编译器吗?试试“gfortran-v”和“f95-v”。您误解了
巨大的函数的精确定义maging(num)
返回与num
具有相同种类和类型的最大数字。返回的值的种类和类型也与num
相同。由于您的所有输入值都是(默认)整数巨大
,因此正确地返回最大的默认大小整数
maging(num)
不返回带有kind=num的最大整数。maging(num)
也不会返回num
字节中可表示的最大数字。虽然许多编译器对4字节和8字节整数使用integer(kind=4)
和integer(kind=8)
等,但语言标准不能保证这一点,也不能依赖于它的可移植性
@MSB的回答告诉你如何做你想做的事,我只是想澄清一下摘要:考虑编译器选项。
自从我使用FORTRAN以来,我已经用了很长一段时间了,我不记得使用过巨大的(),但我稍微看了一下这个。我的英特尔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.0用于
导致
在文件inttest.for中:4
test_int = 9223372036854775807
1
错误:对于(1)处的类型,整数太大
然而,当我使用-fdefault-integer-8选项编译时,一切都很顺利,我得到了一个打印
9223372036854775807
也许还有其他gfortran选项会有用,但我没有进一步调查
当然,这仍然不能得到10^14,但它可能有助于解释您看到的结果。您是否将变量声明为整数*8?在循环中迭代~10^14次?你知道那要花多长时间吗?我想你需要重新考虑你的算法。谢谢。我不知道巨无霸是这样工作的,但现在很明显了。我刚刚发现我的主要问题是没有转换文本,我会写n=123456…9(kind=blah)。写入n=12…9_long,其中long=selected_int_kind(13)可以正常工作。gfortran编译时警告选项之一会通知您常量太大。Try:-fimplicit none-Wall-Wline truncation-Wcharacter truncation-Wsurprising-Waliasing-Wimplicit interface-Wunused parameter-fcheck=all-fbacktrace for gfortran 4.5。或者-fbounds检查早期版本,而不是-fcheck all选项-fdefault-integer-8将默认整数设置为8字节,并且不需要使用8字节整数;它们可以通过声明获得。错误消息“error:Integer对于其在(1)处的种类来说太大”告诉您常量9223372036854775807对于其种类来说太大。解决这个问题不需要将默认的整数类型设为8字节,您可以指定常量的类型。@M.S.B:谢谢您的解释。如何指定常量类型?常量的类型由下划线后跟种类值指定:9223372036854775807_KindValue。最好使用内在的selected_int_kind(对于整数,或selected_real_kind(对于reals))来定义整数/参数“variable”KindValue(请参阅此问题的答案),而不是依赖特定的数值,例如8,它在编译器之间的含义可能不同。