Python中有没有办法计算双/浮点/等中的有效数字?我没有看到一个简单的方法来做到这一点,但我希望它会在图书馆里。
提前致谢。
Python中有没有办法计算双/浮点/等中的有效数字?我没有看到一个简单的方法来做到这一点,但我希望它会在图书馆里。
提前致谢。
您可能对任意精度浮点库感兴趣,例如:
不。有效数字只是没什么大不了的,并且在计算机语言中几乎没有得到支持。进行实际计算的人需要误差线,它具有更高的精度——实际测量会说非常精确的东西,比如“这是 0.11 ± 0.03 毫米”,而不是说“这是 0.1 毫米”或“这是 0.11 毫米”这样不太精确的陈述” 这让你选择了十的幂,即使你的不精确性实际上并没有落在十的幂。
我在另一个问题中找到了这篇文章的解决方案:
这里的想法是将浮点数作为字符串传递给方法,然后该方法使用正则表达式通过拆分字符串来计算有效数字的数量 where "e"
is(对于科学格式的浮点字符串)和点在哪里(对于正常的浮点字符串)。
它似乎可以很好地工作到 8 位有效数字,但不能保证第 9 位之后的行为。
不过,我相信这比
“有效数字没什么大不了的,在计算机语言中几乎没有得到支持”
回复。这可能并不容易,但你绝对可以做到,即使不是很完美。
至少,计算机根本不会那样工作,除非它们被编程为这样做。假设是你给他们的数字是准确的。如果您将数字 2/3 创建为 0.6666666666666667,则所有操作都将其视为完全相同。最低有效数字的错误最终可能会在以后的计算中传播到更大的错误,但这是好的代码应该处理的事情,使用尽可能减少这些问题的算法。
然而,正如我所说,计算机会做他们被告知要做的事情。所以有一些包使用所谓的区间算术。然后可以将一个数字描述为一个区间,因此我们可以创建 2/3 作为区间 [0.6666666666666666,0.6666666666666667]。我们可以对区间进行操作、加法、减法、乘法等。这些操作通常会在我们操作它们时看到区间宽度扩大。
然而,事实是,即使您使用区间算术工具,您也必须在一开始就知道数字中有效数字的位数。如果您创建一个数字为 2.2,并将其存储为双精度数,那么计算机实际上会尝试将该数字存储为 2.200000000000000,并假设所有数字都完全正确。事实上,当然,因为采用了浮点运算,所以该数字实际上将在内部存储为二进制数。所以 2.2 可能会被有效地存储为数字:
2.20000000000000017763568394002504646778106689453125
因为大多数十进制小数不能以二进制形式精确表示。同样,在所有软件中都必须小心,而且使用这些工具的人也必须始终了解他们的数字的真正含义。
最后一点很重要。很多人把电脑产生的数字当作真理,就像电脑神在石碑上传下来的。如果计算机打印出 1.4523656535725,他们相信他们所看到的每一个数字。事实上,这里必须应用常识,要知道这个数字可能是从只有 3 位有效数字的数据生成的,因此您可以选择仅依赖该数字的前几个有效数字。当然,这就是为什么你在学校被教导这个概念,知道什么可以信任,什么不可以信任。但是请记住 - 计算机通常会无限信任。必须应用过滤器的是您。
内置的Decimal 库可以很好地解决这个问题,因为它解决了使用基于硬件的浮点数的问题。它有一个内部表示,只包含有效数字和指数。所以你可以用它来计算这样的有效数字:
from decimal import Decimal
def count_sigfigs(numstr):
return len(Decimal(numstr).normalize().as_tuple().digits)
这适用于很多例子,比如这些例子(来自这个相关问题)。请注意,您必须将数字作为字符串输入才能正常工作。由于它们的硬件表示,使用浮点数会搞砸。
tests = [('2', 1),
('1234', 4),
('2.34', 3),
('3000', 1),
('0.0034', 2),
('120.5e50', 4),
('1120.5e+50', 5),
('120.52e-50', 5)]
for num, expected in tests:
print(count_sigfigs(num) == expected)
这使:
True
True
True
True
True
True
True
True
不幸的是,这不适用于像“1.000”这样有 4 个 sigfigs 的数字。这只是给出 1。所以它需要改进以涵盖所有情况。它也为“0”给出 1,尽管通常应该给出 0。
如果您取出,normalize
那么它适用于1.000
但不适用于 3000(它说 4 而不是 1)。