2017-07-25 44 views
0

比方說,我有一個模塊:參數編碼文件

module testParam 

    real, parameter :: x=1.0, xx=10.0 
    real, parameter :: pi=3.14 

end module testParam 

gfortran -c testParam.f90 

編譯它,並期待在生成的模塊文件

cp testparam.mod testparam.gz 
gunzip testparam.gz 

修整後的輸出是:

(2 'pi' 'testparam' '' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN 
IMPLICIT-SAVE 0 0)() (REAL 4 0 0 0 REAL()) 0 0() (CONSTANT (REAL 4 0 
0 0 REAL()) 0 '[email protected]')() 0()() 0 0) 

4 'x' 'testparam' '' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN 
IMPLICIT-SAVE 0 0)() (REAL 4 0 0 0 REAL()) 0 0() (CONSTANT (REAL 4 0 
0 0 REAL()) 0 '[email protected]')() 0()() 0 0) 

5 'xx' 'testparam' '' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN 
IMPLICIT-SAVE 0 0)() (REAL 4 0 0 0 REAL()) 0 0() (CONSTANT (REAL 4 0 
0 0 REAL()) 0 '[email protected]')() 0()() 0 0) 

然後我們可以看到x的值被存儲爲'[email protected]',pi被存儲爲'[email protected]',xx被存儲爲'[email protected]'。我怎樣才能將字符串編碼參數轉換回數字?

考慮到我最初假定的x項的值很簡單,對於格式a @ b,a * 10^b但是pi的值是十六進制編碼的(對於xx變量int(0xa)== 10.0因此至少它的一部分是十六進制)。也許它的某種十六進制編碼浮點數?

+0

哪個版本的gfortran?雖然說實話,我這樣做的方式可能是'use testParam;打印*,x;結束等等。 – francescalus

+0

5.3.1,我也是,但我正在編寫一些代碼,使用mod文件來確定模塊在沒有「運行」的情況下在做什麼。 – Rob

+1

它看起來像一種轉儲單精度浮點值的二進制形式的形式,並且有些分解了一些位。 「0」之間的部分。而「@」顯然是尾數。我可能猜測「@ 1」以某種形式或方式表示指數,但用數字表示非零指數會更清楚。 – Craig

回答

0

隨着@roygvib評論的幫助下這個工程的蟒蛇

def hextofloat(s): 
    # Given a hex like parameter '[email protected]' returns 5065465344.0 
    man, exp =s.split('@') 
    exp=int(exp) 
    decimal = man.index('.') 
    man = man[decimal+1:] 
    man = man.ljust(exp,'0') 
    man = man[:exp]+'.'+man[exp:] 
    man = man +'P0' 
    return float.fromhex(man) 

分割字符串值到mantisa(0.12decde)和指數(9),得到十六進制數小數點位置右邊(12decde)並填充足夠的零(12decde00),使其至少與指數一樣長,將小數位置放回(12decde00.0),然後在末尾放置一個'P0'(12decde00.P0)並傳遞給float.fromhex()

+0

取決於它需要多麼普遍,你也想要用Inf,NaN和可能​​的+/- 0和非規範化進行測試(最後兩個可能是OK的)。 – Craig