- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设x
和y
都是非常小的数,但我知道x/y
的真实值是合理的。
计算x/y
的最佳方法是什么?特别是,我一直在做 np.exp(np.log(x) - np.log(y)
,但我不确定这是否会有所不同?
最佳答案
根据 Python documentation,Python 使用其运行硬件的浮点特性.在当今最常见的机器上,这是 IEEE-754 算术或类似的算法。该 Python 文档并未明确说明舍入模式,但顺便提到样本除法的结果是最接近的可表示值,因此大概 Python 使用舍入到最近的关系到偶数模式。 (简称“舍入到最近”。如果两个可表示值在二进制 float 中同样接近,则产生其有效数低位为零的值。)
在舍入到最近模式的 IEEE-754 算法中,除法的结果是最接近精确数学值的可表示值。既然你说 x/y
的数学值是合理的,它就在可表示值的正常范围内(不低于它,在次正常范围内,精度受到影响,而不是高于它,结果四舍五入到无穷大)。在正常范围内,基本操作的结果将在格式的正常精度内准确。
但是,由于 x
和 y
是“非常小的数字”,我们可能会担心它们是次正规的,并且在除法之前已经存在精度损失被执行。在 IEEE-754 基本 64 位二进制格式中,低于 2-1022(约 2.22507•10-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)
无论如何,因为次正规值将被刷新为零在那些也是如此。所以我们很可能会排除这种可能性。
关于python - 防止Python浮点除法中的下溢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48180177/
我是一名优秀的程序员,十分优秀!