我使用Python来模拟统计物理,所以我会处理小数字。
例如,
a = 2.22e-300, b = 3e-200
我想计算
a * b = 6.66e-500.
然而,在Python 3中它显示0.0。
我正在考虑设计一种数据类型:存储浮点数的第一部分,这里是6.66,第二部分存储幅度,即-500。
我可以问一下如何实现这个目标?还是有更好的方法来处理科学数字?
答案 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
一样!