需要解决浮标精度不够的问题

2024-09-30 00:33:12 发布

您现在位置:Python中文网/ 问答频道 /正文

到现在为止,我读了很多关于这个主题的书,不仅仅是现在,而是现在。。。 我想我明白这一点,当然我不得不问这个问题有点尴尬,但我缺乏一个合适的解决办法,我觉得这是正确的,可以挽救的。你知道吗

我用了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 ]]

没有这种精确的“崩溃”,这就是我想要的。你知道吗

那么有没有“正确”的方法呢???
谢谢你听我讲故事,很抱歉又把这个问题提出来了^^ 致以最诚挚的问候


Tags: 数据numpy主题np精度random圆形array
1条回答
网友
1楼 · 发布于 2024-09-30 00:33:12

双精度浮点数的精度很高,您只需了解何时何地重要。一些最大的模型使用32位浮点(主要用于运行时性能)甚至16bit variants进行训练

有一些像^{} and ^{}这样的函数可以在模糊的地方提供帮助(虽然我编写了使用上述函数的代码,但我不确定是否有实际影响的值,并且我编写了运行多年的数字代码)。另一个有用的知识是catastrophic cancellation。重写数学/方程对数值稳定性有很大帮助,尽管知道何时何地这样做可能很困难。使用标准算法真的很有帮助,例如花一些时间查看^{},因为要确保它们表现良好,已经做了很多工作

round几乎从来都不是正确的做法,而且往往会使事情变得更糟,尤其是在中间结果上。四舍五入几乎总是用于最终显示。e、 在错误的时间四舍五入,很容易使计算结果变差15个数量级。e、 其中a=1.5b=1.499999999999999a-b~1e-15,而round(a) - round(b)是1。请注意,这些只是一个位的不同,您应该期望积累一些位的错误,很容易将值推到舍入边界的两侧。另外,对于不能很好地编码成二进制浮点数的值,这种情况可能会在尴尬的地方发生

像0.001这样的值不能准确地表示,而且总是有点“错误”。e、 g.试试decimal.Decimal(0.001) 或者0.001.hex()获取实际表示的值

相关问题 更多 >

    热门问题