0

我正在寻找一种有效的方法来在 Python 中以 8 个字符的最高精度打印浮点数。可以使用%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

它可能有点不同的方向,但使用 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

于 2013-02-26T22:33:59.287 回答
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 回答