如何用科学计数法计算和存储数字?

时间:2018-04-01 21:34:18

标签: python-3.x physics scientific-notation

我使用Python来模拟统计物理,所以我会处理小数字。

例如,

a = 2.22e-300, b = 3e-200

我想计算

a * b = 6.66e-500.

然而,在Python 3中它显示0.0。

我正在考虑设计一种数据类型:存储浮点数的第一部分,这里是6.66,第二部分存储幅度,即-500。

我可以问一下如何实现这个目标?还是有更好的方法来处理科学数字?

2 个答案:

答案 0 :(得分:3)

我强烈建议您使用内置decimal模块之类的内容,并根据需要提高其精度。例如:

>>> from decimal import *
>>> getcontext().prec = 100
>>> a = Decimal("2.22e-300")
>>> b = Decimal("3e-200")
>>> a
Decimal('2.22E-300')
>>> b
Decimal('3E-200')
>>> a*b
Decimal('6.66E-500')

请注意,为了安全起见,我使用字符串(例如a)创建b"3e-200"decimal模块正确解析它们。如果没有,它将首先将它们转换为Python的不精确浮点,并在将它们传递到Decimal个对象之前进行清理。

在上面的代码中,我们将精度设置为100。

答案 1 :(得分:2)

创建一个类:

class Sci_note:
    def __init__(self, base, exp):
        self.base = base
        self.exp = exp
    def __mul__(self, other):
        return Sci_note(self.base * other.base,
                        self.exp + other.exp)
    def __str__(self):
        return str(self.base) + 'e' + str(self.exp)

它的功能正如您所期望的那样:

>>> a = Sci_note(2.22, -300)
>>> b = Sci_note(3, -200)
>>> c = a * b
>>> c.base
6.66
>>> c.exp
-500

<强>更新

我添加了__str__方法(上图),因此在打印时会正确显示:

>>> print(a)
2.22e-300

当然,我这里只实现了乘法方法,但是我会在需要时让你自己实现其他方法。情况可能是你只需要乘法,所以如果我现在就把它们写下来就会浪费每个人的时间!

此外,创建__float__处理程序在这里也没用,因为Python 不能处理订单^-300的浮点数,所以对它来说没用返回它们,就像我们得到0一样!