Fortran的长期投注

Sam*_*dis 4 fortran loops largenumber

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

n=SOME_BIG_NUMBER
do i=n,1,-1
Run Code Online (Sandbox Code Playgroud)

我尝试了通常的星形符号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
Run Code Online (Sandbox Code Playgroud)

在所有情况下产生数字2147483647.为什么是这样?我在64位机器上使用gfortran(f95).

如果我需要一个bignum图书馆,人们会建议哪一个?

M. *_* B. 8

我使用的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
Run Code Online (Sandbox Code Playgroud)

获得至少18个十进制数字,通常为8字节整数.

使用gfortran 4.3,巨大的(1_LargeInt_K)输出9223372036854775807.当你写巨大的(1)等时,默认情况下常量是一个默认的整数,这里显然是4字节,因为巨大的返回2147483647.所以有时你需要指定精度常数,而不仅仅是变量 - 更常见的是,当人们在真实常数上丢失有效数字时,这会使人们绊倒,默认为单精度.

另见Fortran:整数*4对整数(4)与整数(种类= 4)

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


Hig*_*ark 8

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

HUGE(num)不返回最大的整数kind=num.也不HUGE(num)返回以num字节为单位表示的最大数字.虽然许多编译器使用integer(kind=4)integer(kind=8) 为4和8字节的整数,这不是由语言标准保证的,并且不能依靠是便携式的.

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