Fortran:最大和最小整数
Fortran对我来说是全新的,有人能帮我解决以下问题吗?我想在我的电脑上找出所有整数种类编号以及每个种类编号的最大值和最小值。我的代码如下所示:Fortran:最大和最小整数,fortran,fortran95,Fortran,Fortran95,Fortran对我来说是全新的,有人能帮我解决以下问题吗?我想在我的电脑上找出所有整数种类编号以及每个种类编号的最大值和最小值。我的代码如下所示: program intkind implicit none integer :: n=1 integer :: integer_range =1 do while(integer_range /= -1) print*, "kind_number ", selected_int_kind(n) call rang(integer
program intkind
implicit none
integer :: n=1
integer :: integer_range =1
do while(integer_range /= -1)
print*, "kind_number ", selected_int_kind(n)
call rang(integer_range)
n = n *2
integer_range = selected_int_kind(n)
end do
contains
subroutine rang(largest)
integer largest
print*, huge(largest)
end subroutine
end
我得到的整数是:1,2,4,8
2147483647
?最小整数是否有一个内在函数rang
时,如何保持整数种类数?我认为这是最大整数的关键subroutine rang(largest)
integer :: largest
print *, huge(largest)
end subroutine
将默认大小的整数作为输入,并打印适合该默认大小整数的最大可能值。它将始终返回巨大的(默认整数),在大多数系统上是巨大的(4字节整数),或2147483647<代码>巨大只考虑变量类型;它不会以任何方式解释变量。您可以执行上面尝试的操作的唯一方法是使用参数化的派生类型,这些派生类型非常新,因此在编译器中对它的支持仍然有点参差不齐
如果要查看不同类型整数的范围,必须使用不同的变量:
program integerkinds
use iso_fortran_env
implicit none
integer :: i
integer(kind=int8) :: i8
integer(kind=int16) :: i16
integer(kind=int32) :: i32
integer(kind=int64) :: i64
integer(kind=selected_int_kind(6)) :: j6
integer(kind=selected_int_kind(15)):: j15
print *,'Default:'
print *, huge(i)
print *,'Int8:'
print *, huge(i8)
print *,'Int16:'
print *, huge(i16)
print *,'Int32:'
print *, huge(i32)
print *,'Int64:'
print *, huge(i64)
print *,''
print *,'Selected Integer Kind 6:'
print *, huge(j6)
print *,'Selected Integer Kind 15:'
print *, huge(j15)
end program integerkinds
跑步可以带来:
$ ./intkinds
Default:
2147483647
Int8:
127
Int16:
32767
Int32:
2147483647
Int64:
9223372036854775807
Selected Integer Kind 6:
2147483647
Selected Integer Kind 15:
9223372036854775807
纯粹作为附录或替代观点,Fortran变量是根据分配给变量的内存字节数来定义的。实际上,所有可比较的编译器都是根据分配的字节来定义变量的,否则系统很难在内存中分配/存储变量,如果没有这些,很难执行算术等 对于像我这样的一些人来说,使用稍旧的表示法(而不是“kind-konfusion”)更容易看到发生了什么。特别是,许多编译器在kind和bytes/var之间提供了直接的1:1对应关系,这使得最大/最小整数的计算变得相当简单(有些编译器使用非线性或非直接的通信)。尽管最后一定要注意可移植性帮助。例如
Integer(1) :: Int1 ! corresponds to a 1 byte integer
Integer(2) :: Int1 ! corresponds to a 2 byte integer
Integer(4) :: Int1 ! corresponds to a 4 byte integer
Integer(8) :: Int1 ! corresponds to an 8 byte integer
Integer, Parameter :: DP = Kind(1.0d0) ! a standard Double Precision/8-byte declaration
Integer, Parameter :: I4B = 4 ! NOTICE, here the "Integer" bit has not been explicitly "sized", so defaults to "Integer(4)"
!
Real(DP) :: ADoublePrecReal ! an 8-byte Real (approx 15 decimal places with exp +/- approx 300, see Real data model)
!
Integer(I4B) :: AStandardInt ! a 4-byte integer.
类似的表示法也适用于其他Fortran类型(实型、逻辑型等)。如果未指定“大小”,则所有var类型都有默认分配的字节数
特定类型的最大字节数还取决于编译器和系统(例如整数(16)并非在所有系统上都可用,等等)
一个字节是8位,因此如果从1开始编号,则单个字节应能够容纳最大值2^8=256;如果从0开始编号,则单个字节应能够容纳最大值2^8=255
但是,在Fortran中,(几乎所有)数值变量都是“有符号的”。这意味着在位表示中的某个位置,需要一位来跟踪该数字是+ve数字还是-ve数字。因此,在本例中,最大值为2^7,因为“符号”有一位是“丢失/保留的”因此,有符号1字节整数的可能值为-127:+128(注意Abs(limits)和为255,因为“0”占据一个位置,总共256个“things”,这是应该的)
类似的规则适用于所有这类变量,指数“n”为2^n,根据字节数变化。例如,整数(8)var有8个字节,即64位,其中1位丢失/保留用于符号信息,因此如果从1开始编号,则最大可能值为2^63=9223372036854775808,或者从0开始编号时最大可能值为4611686018427387904
标准整数数据模型可概括为:
IntNum = s * Sum[ w(k) * 2 ^ (k-1), k=1:(NumBytes*8)-1],
其中s=“sign”(+/-1),w(k)是第k位值的1或0
在类型声明中不需要使用显式数字或env变量;允许使用用户定义的编译时常量(即参数)
Integer(1) :: Int1 ! corresponds to a 1 byte integer
Integer(2) :: Int1 ! corresponds to a 2 byte integer
Integer(4) :: Int1 ! corresponds to a 4 byte integer
Integer(8) :: Int1 ! corresponds to an 8 byte integer
Integer, Parameter :: DP = Kind(1.0d0) ! a standard Double Precision/8-byte declaration
Integer, Parameter :: I4B = 4 ! NOTICE, here the "Integer" bit has not been explicitly "sized", so defaults to "Integer(4)"
!
Real(DP) :: ADoublePrecReal ! an 8-byte Real (approx 15 decimal places with exp +/- approx 300, see Real data model)
!
Integer(I4B) :: AStandardInt ! a 4-byte integer.
由于Parameter语句可以在另一个模块中通过Use etc访问,因此为所需的“精度”的替代定义重新编译大型复杂代码是一件简单的事情。例如,如果将DP编辑为Kind(1.0),则应用该声明的任何地方都将成为“单精度”实数
Fortran内部函数magnage()、Tiny()等有助于确定在给定系统上可能发生的情况
使用Fortran“bit”内部函数和其他工具/方法可以实现更多功能。如果:selected_int_kind(9)=4,integer(kind=selected_int_kind(9))::j4和mage(j4)在我的电脑上是:2147483647。selected_int_kind(r)的定义表示它可以表示-10r
integer(8)
或real(4)
,只需识别编译器支持的类型之一。例如,NAG Fortran编译器默认为整数(2)
表示4字节整数和整数(3)
用于8字节整数。编译器通常会使用与所用字节数匹配的种类选择器,但这不是标准所要求的。这是一个常见的误解。请参见“是”,每个编译器供应商都可以做任何他们喜欢做的事,并且经常这样做。是的,如果能够不止一次强调两者之间的差异,这会有所帮助en systems(显然,对某些人来说,一次是不够的)。不过,对于Compaq、DEC、IBM、CRAY、Oracle、Intel等编译器,最初的评论是正确的,其种类/字节与