2013-02-26 83 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()