2012-03-05 138 views
10

Fortran對我來說是全新的,任何人都可以幫助我解決以下問題嗎?我想找出所有整數類型數字和我的電腦上每種類型數字的最大和最小值。我有下面列出的代碼: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。

  1. 爲什麼每種類型的每個最大整數數字相同:2147483647?對於最小的整數是否有一個固有的函數?

  2. 當子程序rang被調用時,我該如何保持整數類型號?我認爲這是最大整數的關鍵。

+0

只爲稍後有人出現。雖然沒有內在的,你可以使用'-huge(n)'來計算可用的最小整數。 – NoseKnowsAll 2016-02-05 22:36:58

回答

15

你的子程序:

subroutine rang(largest) 
    integer :: largest 
    print *, huge(largest) 
end subroutine 

需要輸入一個默認大小的整數,並打印出最大的可能值,將適合在默認大小的整數。它會總是返回巨大(默認整數),這是在大多數系統上,巨大(4字節整數),或2147483647. huge只考慮變量類型;它不以以任何方式解釋變量。你可以做的事情的唯一方法就是使用參數化的派生類型,這些派生類型足夠新,以至於在編譯器中對它的支持仍然有點多餘。

如果你想看看整數不同種類的範圍,你將不得不使用不同的變量:

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 
+0

IF:selected_int_kind(9)= 4,整數(KIND = selected_int_kind(9)):: J4和巨大(J4)是:2147483647我的電腦上。 selected_int_kind(r)的定義表示它可以表示在-10 ** r < n > 10 ** r範圍內的整數值n。如果r = 9,那麼最大值是10 ** 9-1,小於2147483647(巨大(j4)),爲什麼?我無法理解它。 – echo 2012-03-05 17:38:10

+0

第一部分:是的,巨大的(j4)應該是2147483647,因爲j4被定義爲整數(kind = selected_int_kind(9))。但請注意,您必須*定義* j4是那種類型。變量定義完成後,您不能只改變種類;例如,你可以隨時調用selected_int_kind()多次,並且它不會改變任何東西。上面的例子顯示瞭如何定義各種類型。 – 2012-03-05 18:56:07

-6

純粹作爲附錄,或者可選的角度來看,Fortran變量是根據分配給var的內存字節數來定義的。事實上,所有可比較的編譯器都是按字節分配來定義變量的,否則系統很難在內存中分配/存儲,而且如果沒有這樣的話,就很難執行算術運算等。

對於一些像我一樣,更容易看到什麼是用年齡稍大的符號(而不是「那種konfusion」怎麼回事尤其是,很多編譯器提供了直接的1:類和1之間的對應關係字節/ var,然後使得最大/最小整數的計算相當簡單(某些編譯器使用非線性或非直接的對應關係),儘管一定要注意最後的可移植性協助,例如

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 

類似的表示法適用於其他類型的Fortran(房地產,邏輯等),所有變種類型有如果未指定「大小」分配字節的默認號碼。

特定類型的最大字節數也取決於編譯器和系統(例如,整數(16)在所有系統上不可用等)。

一個字節是8位,所以如果從1開始編號,或者從255開始,從0開始,單個字節應該能夠容納最大值2^8 = 256。

但是,在Fortran中,(幾乎所有)數字變量都是「簽名」的。這意味着在位表示的某個位置需要一位來跟蹤數字是+ ve數還是-ve數。所以在這個例子中,最大值爲2^7,因爲「符號」信息的一位是「丟失/保留」。因此,對於一個帶符號的1字節整數可能的值是-127:+128(請注意Abs(限制)總和爲255,因爲「0」佔據一個位置,總共有256個「事物」,因爲它應該是)。

一個類似的規則適用於所有這些變量,簡單的指數「n」在2^n中,根據字節數而變化。例如,一個Integer(8)變種具有8個字節或64個比特,1個比特丟失符號信息/保留,因此,如果開始時爲1,或= 4611686018427387904編號的最大可能值是2^63 = 9223372036854775808,從0

標準的整數數據模型將被概括爲:

IntNum = s * Sum[ w(k) * 2^(k-1), k=1:(NumBytes*8)-1], 

其中s = 「符號」(+/- 1)中,w(k)是第k個比特爲1或0值。

一個不需要使用明確的數字或​​ENV的類型聲明瓦爾;用戶定義的編譯時間常數(即參數)是允許的。例如

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. 

由於參數聲明可以是通過使用等訪問的另一模塊,它是一個簡單的事情重新編譯大型複雜代碼的期望的「精確度」交替定義。例如,如果將DP編輯爲Kind(1.0),則應用該聲明的所有位置都將變爲「單精度」Real。

Fortran內部函數巨大(),Tiny()等幫助確定給定系統上可能的內容。

使用Fortran「位」內在函數和其他工具/方法可以實現更多功能。

+6

這個答案的出發點是錯誤的:Fortran變量沒有按照它們佔用的字節數來定義。種類選擇器,諸如「integer(8)」或「real(4)」等表達式中的整數只是標識編譯器支持的種類之一。例如,NAG Fortran編譯器對於4字節整數缺省爲「整數(2)」,對於8字節整數缺省爲「整數(3)」。編譯器通常使用與所用字節數相匹配的種類選擇器,但標準並不要求這種選擇器。 – 2014-08-13 05:33:41

+3

這是一個常見的誤解。又見http://stackoverflow.com/questions/3170239/fortran-integer4-vs-integer4-vs-integerkind-4 – 2014-08-13 08:03:46

+0

是的,每個編譯器供應商可以做他們什麼都喜歡,常做。是的,這將有助於不止一個人強調系統之間的差異(顯然,一旦有些人不夠)。儘管如此,對Compaq,DEC,IBM,CRAY,Oracle,Intel等編譯器的原始評論是正確的,類型/字節完全相同。我還強調了將全球參數用於良好實踐,其原因與其他人僅在病房後引用的相同。另外,可以肯定的是整數數據模型的表達是正確的,請檢查任何書籍。 – DrOli 2014-08-15 06:15:34