【问题标题】:Decimal-module is not working on binary level? How?十进制模块不适用于二进制级别?如何?
【发布时间】:2021-01-01 01:35:54
【问题描述】:

对于启动程序时后台发生的事情,我是个初学者。现在我的重点是“Python”中“十进制”和“浮点”之间的区别。我阅读了以下有关此的文章:

Decimal vs float in Python

是的,我现在知道“十进制”的作用以及如何使用此模块。但是,我在下面这句话之后问了“十进制”到底是如何工作的:

“与浮点数不同,decimal 模块中定义的十进制对象不容易出现这种精度损失,因为它们不依赖于二进制分数。”

据我所知,计算机只能使用二进制数系统。所以我的问题是:当“十进制”模块不在二进制级别处理时,计算机如何处理和使用模块?

【问题讨论】:

  • “不容易出现这种精度损失,因为它们不依赖二进制分数”过度简化了 base2/base10 问题,以至于它完全是错误的。

标签: python module floating-point binary decimal


【解决方案1】:

在这种情况下,“二进制分数” - 是一种将浮点值存储在内存中的方法。或者更准确地说,将任何基数的浮点数表示为二进制。 是的,一切都存储为二进制文件,计算机确实在低级别运行二进制文件。 然而,在高层次上,我们很少专门使用二进制文件。我们使用字符串、整数、浮点数等——这些只是一种方便的抽象,让人们更容易使用它。

回到你的问题:

Python 的float 确实将其值存储为二进制表示。这正是它可能产生精密伪影的原因。

另一方面,十进制不会将浮点数作为一个整体进行运算。它单独保存数字的所有部分,然后单独操作它们。 别忘了,Decimal - 是一个类,而不是原子类型。

这是来自 Decimal 来源的 sn-p:

    if intpart is not None:
        # finite number
        fracpart = m.group('frac') or ''
        exp = int(m.group('exp') or '0')
        self._int = str(int(intpart+fracpart))
        self._exp = exp - len(fracpart)
        self._is_special = False

如您所见,它检索整数、指数和其他实用数据并单独存储它们。

十进制的精度是以计算和内存资源为代价实现的。

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2020-04-25
    • 2014-10-30
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2021-11-29
    • 2016-02-14
    • 1970-01-01
    相关资源
    最近更新 更多