2013-02-26 42 views
0

我正在寻找一种高效的方式来以最高精度在8个字符中打印Python中的浮点数。取决于编号,可以使用%f%e格式。您可以省略前导零和尾随零,因此-0.123456可以写为-.123456。如果使用科学记数法,您也可以省略“e”,所以-1.234e-8可以写成-1.234-8以尽可能高的精度打印8个字符的浮点数

基本上,我找的这一个更快的版本: http://code.google.com/p/pynastran/source/browse/trunk/pyNastran/bdf/fieldWriter.py#80

分析后,我发现我的代码已支出约其在联例行半的时间,这就是所谓数十万次。

+0

你打算如何使用它? – ATOzTOA 2013-02-26 17:29:43

+3

是什么让你说链接代码太慢? – Neil 2013-02-26 17:30:15

+0

@ATOzTOA - 我的程序正在为NASTRAN(结构分析工具)编写输入文件。它允许浮点格式的一些古怪的变化。 – gte258v 2013-02-26 17:37:05

回答

0

它可能有点不同,但使用python3-64有十进制小数使用内置的十进制模块

http://docs.python.org/3.3/library/decimal.html#

下面是一个例子:

>>> from decimal import * 
>>> getcontext().prec = 20 
>>> D = decimal.Decimal 
>>> D('1')/D('22') 
Decimal('0.045454545454545454545') 
>>> getcontext().prec = 40 
>>> D('1')/D('22') 
Decimal('0.04545454545454545454545454545454545454545') 
>>> 

PS。由于条款&条件总是适用,请检查连续操作的注意事项:http://docs.python.org/3.3/library/decimal.html#mitigating-round-off-error-with-increased-precision

+0

不幸的是,我使用Python 2.7。另外,我并不需要很高的精度,因为我只有8个角色可以使用。我只是想用数量的大小来改变小数位数,所以我使用全部8个字符。 – gte258v 2013-02-27 02:38:57

+0

所以这是一个格式问题,而不是精确度问题? – 2013-02-27 07:15:54

0

这是我能够想到的最好的。它比我以前使用的功能更可读(在我看来),但它不会更快。

def print_float_8(val, tol=0.0): 
    if abs(val) <= tol: 
     return '  0.' 
    if val < 0: 
     return print_float_neg_8(val) 
    else: 
     return print_float_pos_8(val) 

def print_float_pos_8(val): 
    if val < 0.01 or val > 100000: 
     return print_float_sci_pos_8(val) 
    if val < 0.1: 
     f = '%8.6g' % val 
    else: 
     f = '%8.7g' % val 
    if len(f) > 8: 
     f = f.lstrip('0') 
    return f 

def print_float_sci_pos_8(val): 
    if val < 1.0e-9: 
     f = ('%10.3e' % val).replace('e-', '-') 
    elif val < 1: 
     f = ('%10.4e' % val).replace('e-0', '-') 
    elif val <= 1.0e9: 
     f = ('%10.4e' % val).replace('e+0', '+') 
    else: 
     f = ('%10.3e' % val).replace('e+', '+') 
    return f.strip() 

def print_float_neg_8(val): 
    if val > -0.01 or val < -10000: 
     return print_float_sci_neg_8(val) 
    if val > -0.1: 
     f = '%8.5g' % val 
    else: 
     f = '%8.6g' % val 
    if len(f) > 8: 
     f = f.replace('-0.', '-.') 
    return f 

def print_float_sci_neg_8(val): 
    if val > -1.0e-9: 
     f = ('%-8.2e' % val).replace('e-', '-') 
    elif val > -1: 
     f = ('%-8.3e' % val).replace('e-0', '-') 
    elif val >= -1.0e9: 
     f = ('%-8.3e' % val).replace('e+0', '+') 
    else: 
     f = ('%-8.2e' % val).replace('e+', '+') 
    return f.strip()