2017-07-25 39 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