p-v*_*lue 2 python floating-point precision underflow
假设 和x都是y非常小的数字,但我知道 的真实值x / y是合理的。
最好的计算方法是什么x/y?特别是,我一直在np.exp(np.log(x) - np.log(y)这样做,但我不确定这是否会产生影响?
根据Python 文档,Python 使用其运行硬件的浮点功能。在当今最常见的机器上,这是 IEEE-754 算法或类似的算法。该 Python 文档没有明确说明舍入模式,但顺便提到样本除法的结果是最接近的可表示值,因此推测 Python 使用舍入到最近的联系到偶数模式。(简称\xe2\x80\x9c舍入到最接近的\xe2\x80\x9d。如果两个可表示的值在二进制浮点中同样接近,则生成其有效数的低位为零的值。)
\n\n在舍入到最接近模式的 IEEE-754 算术中,除法的结果是最接近精确数学值的可表示值。既然你说 的数学值x/y是合理的,那么它就在可表示值的正常范围内(不低于它,在低于正常范围,精度受到影响,也不高于它,结果四舍五入到无穷大)。在正常范围内,初等运算的结果将在格式的正常精度内准确。
然而,由于\xe2\x80\x9cx和y\xe2\x80\x9c 非常小,\xe2\x80\x9d 我们可能担心它们是次正规的,并且在执行除法之前它们已经失去了精度。在 IEEE-754 基本 64 位二进制格式中,低于 2 -1022(约 2.22507\xe2\x80\xa210 -308)的数字是次正规的。如果x和y小于该值,那么它们已经损失了精度,并且除了偶然之外没有任何方法可以从中产生正确的商。取对数来计算商是没有帮助的。
如果您运行的机器碰巧没有使用 IEEE-754,那么x/y直接计算仍然可能会产生比np.exp(np.log(x)-np.log(y)). 前者是计算硬件中基本功能的单个操作,该硬件可能设计合理。后者是在软件中计算复杂功能的若干运算,使用普通硬件运算很难准确地实现。
人们对浮点运算存在相当多的不安和不信任。缺乏知识似乎会导致人们害怕他们。但这里应该理解的是,基本浮点运算的定义非常明确,并且在正常范围内是准确的。浮点计算的实际问题源于运算序列上舍入误差的累积、复合误差的固有数学以及对结果的不正确期望。这意味着无需担心单个除法的准确性。相反,应该牢记的是浮点的整体使用。(如果您的问题提供了更多背景信息,可以更好地回答您的问题,阐明为什么这个划分很重要,如何x以及如何y根据先前的数据产生,以及总体目标是什么。)
与 IEEE-754 的一个常见偏差是将次正常值刷新为零。如果您有一些x不y正常的情况,某些实现可能会在对它们执行操作之前将它们刷新为零。然而,这种情况在 SIMD 代码中比在普通标量编程中更常见。而且,如果发生这种情况,它会阻止您进行评估,np.log(x)无论如何np.log(y),因为这些值中的次正常值也会被刷新为零。所以我们可以排除这种可能性。
| 归档时间: |
|
| 查看次数: |
8754 次 |
| 最近记录: |