最近有人想要一个无冲突散列函数将一百万个值散列为32位散列值。如果你知道birthday paradox,你就知道那不可能是无碰撞的。但是想知道概率,我这样计算(从概率1开始,然后对于一百万个值中的每一个,乘以它不是前面的概率):
>>> p = 1
>>> for i in range(10**6):
p *= (2**32 - i) / 2**32
>>> p
2.7390147476139603e-51
但是我在那里增加了一百万个浮动,所以我担心会失去越来越多的准确性
有没有一种数字类型,与简单的浮点数不同,它不仅给我一个不准确的数字,而且告诉我它有多不准确?像[2.73e-51, 2.74e-51]
这样的范围,或者像2.7390147476139603e-51 +/- 1e-54
这样的错误
或者是否有其他方法来检查结果的准确性
这是一种最坏的情况:在每个操作(乘法或除法)上,显式地将结果乘以1+2^-52或1-2^-52,并检查(使用
assert
)它是否确实产生了差异。这应该估计出不确定性的上限,它仍然很小——它在没有任何断言失败的情况下到达终点,差值是10^9的一部分给予
请注意,如果
(1 - sys.float_info.mant_dig)
被-sys.float_info.mant_dig
替换(即使用2^-53而不是2^-52),则断言开始失败作为commented by Eric Postpischil,这是“interval arithmetic和相关概念”
谷歌搜索python interval arithmetic发现PyInterval。让我们试试:
输出(运行on repl.it):
让我们将其与integer calculation的边界进行比较:
因此
interval
解的精度较低(它是一个较大的区间,只有下界和上界的前十位匹配),但它是正确的(实际值确实在区间内)。从这个意义上说,我想它永远是正确的,尽管我没有研究它是如何工作的获得范围的一种方法是使用整数,通过10100缩放概率。对于下限,始终向下舍入;对于上限,始终向上舍入:
调整它们:
我们可以看到
p
(thefloat
)实际上超出了实际范围,有点太小了。但它的前12位数字是正确的,所以看起来很不错通过比较
lower
和upper
,我们还得到了更多匹配的数字,从而得到了正确的数字:2.739014747614072227115028053996911215831436E-51。有了更大的比例因子,我们可以得到更多相关问题 更多 >
编程相关推荐