根据您使用的整数的大小,可能有可移植的方法在您的系统上使用扩展精度整数。标准模块 ISO_FORTRAN_ENV 应定义多种整数类型(INT8、INT16、INT32、INT64 等)。从 Fortran 2008 开始,这些类型包含在数组 INTEGER_KINDS 中,但目前的实现似乎参差不齐。
如果您的空间仍然不足,您有两种选择:重新构造您的问题以在您拥有的精度范围内工作,或者寻找扩展的或任意精度的数学库。令人高兴的是,LBNL 的http://crd-legacy.lbl.gov/~dhbailey/mpdist/ 下列出了许多这样的库
更新:
selected_int_kind 是创建扩展精度值的另一种动态方法,但您仍然需要知道编译器接受哪些“种类”值。例如:
program kind_int
use iso_fortran_env, only: output_unit, INT8, INT16, INT32, INT64!, &
! INTEGER_KINDS
implicit none
integer :: i
1 format(A)
2 format('Kind name = ', A5, T20, 'kind value = ',I2, &
T40, 'maximum = ', I19)
3 format('Available kind values: ', I2, *(', ', I2))
continue
write(output_unit, 1) 'Maximum value of supported integer kinds:'
write(output_unit, 2) 'INT8 ', INT8, huge(1_INT8)
write(output_unit, 2) 'INT16', INT16, huge(1_INT16)
write(output_unit, 2) 'INT32', INT32, huge(1_INT32)
write(output_unit, 2) 'INT64', INT64, huge(1_INT64)
write(output_unit, 2) '16 ', 16, huge(selected_int_kind(16))
write(output_unit, 2) '32 ', 32, huge(selected_int_kind(32))
! write(output_unit, 3) INTEGER_KINDS
stop
end program kind_int
在 linux64 系统上使用 gfortran 提供以下内容:
Maximum value of supported integer kinds:
Kind name = INT8 kind value = 1 maximum = 127
Kind name = INT16 kind value = 2 maximum = 32767
Kind name = INT32 kind value = 4 maximum = 2147483647
Kind name = INT64 kind value = 8 maximum = 9223372036854775807
Kind name = ik32 kind value = 16 maximum = 170141183460469231731687303715884105727
Kind name = ikxx kind value = 16 maximum = 170141183460469231731687303715884105727
Selected int kind value = 1 kind value = 1
Selected int kind value = 2 kind value = 1
Selected int kind value = 3 kind value = 2
Selected int kind value = 4 kind value = 2
Selected int kind value = 5 kind value = 4
Selected int kind value = 6 kind value = 4
Selected int kind value = 7 kind value = 4
Selected int kind value = 8 kind value = 4
Selected int kind value = 9 kind value = 4
Selected int kind value = 10 kind value = 8
Selected int kind value = 11 kind value = 8
Selected int kind value = 12 kind value = 8
Selected int kind value = 13 kind value = 8
Selected int kind value = 14 kind value = 8
Selected int kind value = 15 kind value = 8
Selected int kind value = 16 kind value = 8
Selected int kind value = 17 kind value = 8
Selected int kind value = 18 kind value = 8
Selected int kind value = 19 kind value = 16
Selected int kind value = 20 kind value = 16
Selected int kind value = 21 kind value = 16
Selected int kind value = 22 kind value = 16
Selected int kind value = 23 kind value = 16
Selected int kind value = 24 kind value = 16
Selected int kind value = 25 kind value = 16
Selected int kind value = 26 kind value = 16
Selected int kind value = 27 kind value = 16
Selected int kind value = 28 kind value = 16
Selected int kind value = 29 kind value = 16
Selected int kind value = 30 kind value = 16
Selected int kind value = 31 kind value = 16
Selected int kind value = 32 kind value = 16
Selected int kind value = 33 kind value = 16
Selected int kind value = 34 kind value = 16
Selected int kind value = 35 kind value = 16
Selected int kind value = 36 kind value = 16
Selected int kind value = 37 kind value = 16
Selected int kind value = 38 kind value = 16
Selected int kind value = 39 kind value = -1
稍作修改,程序在同一系统上使用 ifort 产生以下结果:
Maximum value of supported integer kinds:
Kind name = INT8 kind value = 1 maximum = 127
Kind name = INT16 kind value = 2 maximum = 32767
Kind name = INT32 kind value = 4 maximum = 2147483647
Kind name = INT64 kind value = 8 maximum = 9223372036854775807
Selected int kind value = 1 kind value = 1
Selected int kind value = 2 kind value = 1
Selected int kind value = 3 kind value = 2
Selected int kind value = 4 kind value = 2
Selected int kind value = 5 kind value = 4
Selected int kind value = 6 kind value = 4
Selected int kind value = 7 kind value = 4
Selected int kind value = 8 kind value = 4
Selected int kind value = 9 kind value = 4
Selected int kind value = 10 kind value = 8
Selected int kind value = 11 kind value = 8
Selected int kind value = 12 kind value = 8
Selected int kind value = 13 kind value = 8
Selected int kind value = 14 kind value = 8
Selected int kind value = 15 kind value = 8
Selected int kind value = 16 kind value = 8
Selected int kind value = 17 kind value = 8
Selected int kind value = 18 kind value = 8
Selected int kind value = 19 kind value = -1
正如 Vladimir F 建议的那样,您可以通过使用 selected_int_type 获得一些额外的精度,但它会因硬件和编译器而异,并且可能会或可能不会根据问题为您提供足够的精度。