到现在为止,我读了很多关于这个主题的书,不仅仅是现在,而是现在。。。 我想我明白这一点,当然我不得不问这个问题有点尴尬,但我缺乏一个合适的解决办法,我觉得这是正确的,可以挽救的。你知道吗
我用了numpy和dtypenumpy.flaot64号,我理解为双精度,只是为了防止常见的浮点问题。但现在通过测试它还是一样的。 我有几十亿(真的)计算要做,(这是我选择np的另一个原因),所以速度是关键,我不想这样做np.圆形()我计算的每一步。。。准确的结果是什么,因为我只有点后的3位数。 你当然可以争辩,为什么不把它乘以1000,或者10000,问题解决了,numpy马上就做了这样的事情。但这将导致更多的问题,在进一步的计算,因为有更多的计算之后。 让我们看看问题:
a = np.array([[7.125], [5.233]], dtype=np.float64)
b = np.array([[7.124], [5.232]], dtype=np.float64)
c = a - b
print(repr(c))
array([[0.001000000000000334 ],
[0.0009999999999994458]])
很简单!!! 我不需要解释为什么会发生这种情况,我不想找一个解决办法np.圆形()或回火np.set\u打印选项(),我知道这不会改变我的数据,但只是我呈现数据的方式。 我以为64位双精度(128是不幸的不可能,因为所有的大处理,我必须做我的室友赢PC xD发生,现在,我怀疑它能解决我的问题,但纠正我,如果我错了!!!)它从来没有超过10个数字,就足够精确地做到这一点。 看看如果我这样做会发生什么:
a = np.random.randint(1000, 1000000,(5, 2))
b = np.random.randint(1000, 1000000,(5, 2))
a = a / 1000
b = b / 1000
c = a - b
print(a.dtype)
print(c)
>>>float64
[[ 375.929 -833.91 ]
[ 482.509 -106.411]
[ -2.08 -64.672]
[ 395.236 -383.997]
[ 213.829 -101.08 ]]
没有这种精确的“崩溃”,这就是我想要的。你知道吗
那么有没有“正确”的方法呢???
谢谢你听我讲故事,很抱歉又把这个问题提出来了^^
致以最诚挚的问候
双精度浮点数的精度很高,您只需了解何时何地重要。一些最大的模型使用32位浮点(主要用于运行时性能)甚至16bit variants进行训练
有一些像^{} and ^{} 这样的函数可以在模糊的地方提供帮助(虽然我编写了使用上述函数的代码,但我不确定是否有实际影响的值,并且我编写了运行多年的数字代码)。另一个有用的知识是catastrophic cancellation。重写数学/方程对数值稳定性有很大帮助,尽管知道何时何地这样做可能很困难。使用标准算法真的很有帮助,例如花一些时间查看^{} ,因为要确保它们表现良好,已经做了很多工作
round
几乎从来都不是正确的做法,而且往往会使事情变得更糟,尤其是在中间结果上。四舍五入几乎总是用于最终显示。e、 在错误的时间四舍五入,很容易使计算结果变差15个数量级。e、 其中a=1.5
和b=1.499999999999999
,a-b
~1e-15,而round(a) - round(b)
是1。请注意,这些只是一个位的不同,您应该期望积累一些位的错误,很容易将值推到舍入边界的两侧。另外,对于不能很好地编码成二进制浮点数的值,这种情况可能会在尴尬的地方发生像0.001这样的值不能准确地表示,而且总是有点“错误”。e、 g.试试
decimal.Decimal(0.001)
或者0.001.hex()
获取实际表示的值相关问题 更多 >
编程相关推荐