【问题标题】:How to calculate and store the number in scientific notation?如何以科学计数法计算和存储数字?
【发布时间】:2018-04-01 21:34:18
【问题描述】:

我正在使用 Python 对统计物理建模,所以我将处理小数字。

例如,

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

我要计算

a * b = 6.66e-500.

但是,在 Python 3 中,它显示为 0.0。

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

请问我该如何实现?或者有没有更好的方法来处理科学数字?

【问题讨论】:

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


    【解决方案1】:

    创建一个类:

    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

    【讨论】:

    • 您的课程比decimal library 更准确。
    • @kabanus 是的,因为 Python 会立即将任何 e 表示法转换为浮点数并且浮点数只有有限的精度,所以无论您使用什么库尝试存储 2.22 ^ -300 (非常 small),它将失去它的值并变成0,这会产生OP在乘法时返回0的问题:)
    • @csl 这从不直接处理像2.22 ^ -300 这样的微小浮点数,它分别存储基数和指数,因此它们不会丢失精度。
    • 虽然这段代码很简洁,但我不建议任何人编写自己的 fixnum 类,除非他们有非常特殊的需求。
    • 顺便说一句,乔,你应该提供演员表操作员。
    【解决方案2】:

    我强烈建议您使用内置 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')
    

    请注意,为了安全起见,我使用字符串(例如"3e-200")创建ab,以让decimal 模块正确解析它们。如果不是,它会首先将它们转换为 Python 的不精确浮点数并在将它们传递到 Decimal 对象之前将它们弄脏。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多