Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran:最大和最小整数_Fortran_Fortran95 - Fatal编程技术网

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

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_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)的定义表示它可以表示-10r10r范围内的所有整数值n。如果r=9,那么最大的值是10**9-1,它小于2147483647(大(j4)),为什么?我无法忍受。第一部分:是的,大(j4)应该是2147483647,因为j4被定义为整数(种类=选定的种类(9)).但请注意,您必须将j4定义为那种类型。您不能在定义变量后仅更改类型;例如,您可以调用selected_int_kind()以后可以任意多次使用,并且不会改变任何内容。上面的示例演示了如何定义各种类型的类型。这个答案一开始就错了:Fortran变量不是根据它们所占用的字节数定义的。类型选择器,表达式中的整数,例如
    integer(8)
    real(4)
    ,只需识别编译器支持的类型之一。例如,NAG Fortran编译器默认为
    整数(2)
    表示4字节整数和
    整数(3)
    用于8字节整数。编译器通常会使用与所用字节数匹配的种类选择器,但这不是标准所要求的。这是一个常见的误解。请参见“是”,每个编译器供应商都可以做任何他们喜欢做的事,并且经常这样做。是的,如果能够不止一次强调两者之间的差异,这会有所帮助en systems(显然,对某些人来说,一次是不够的)。不过,对于Compaq、DEC、IBM、CRAY、Oracle、Intel等编译器,最初的评论是正确的,其种类/字节与