0

8文字で可能な限り最高の精度でPythonでフロートを印刷する効率的な方法を探しています。数値に応じて、%fまたは書式設定を使用できます。%e先頭と末尾のゼロは省略-0.123456できるので、 と書くことができます-.123456。科学表記法を使用する場合は、「e」を省略して-1.234e-8と書くこともできます-1.234-8

私は基本的にこれのより高速なバージョンを探しています: http://code.google.com/p/pynastran/source/browse/trunk/pyNastran/bdf/fieldWriter.py#80

プロファイリングを行った後、コードがリンクされたルーチンで約半分の時間を費やしていることがわかりました。これは何十万回も呼び出されます。

4

2 に答える 2

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()
于 2013-02-27T14:08:34.120 に答える
0

少し違う方向かもしれませんが、python3-64 を使用すると、組み込みのdecimal モジュールを使用して多数の小数が表示されます。

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

于 2013-02-26T22:33:59.287 に答える