【发布时间】:2012-05-18 20:22:03
【问题描述】:
我目前正在收紧浮点数字以估计值。 (对于那些感兴趣的人来说,它是:p(k,t)。)本质上,该实用程序永远不会产生该值的低估:可能的素数生成的安全性取决于数值稳健的实现。虽然输出结果与公布的值一致,但我使用了DBL_EPSILON 值来确保除法,特别是,产生的结果永远不会小于真实值:
考虑:double x, y; /* assigned some values... */
评估:r = x / y; 经常发生,但这些(有限精度)结果可能会从真实结果中截断有效数字 - 可能是无限精度的理性扩展。我目前尝试通过对分子应用偏差来缓解这种情况,即
r = ((1.0 + DBL_EPSILON) * x) / y;
如果您对这个主题有所了解,p(k,t) 通常比大多数估计值要小得多 - 但它根本不足以解决这个“观察”的问题。我当然可以说:
(((1.0 + DBL_EPSILON) * x) / y) >= (x / y)
当然,我需要确保“偏差”结果大于或等于“精确”值。虽然我确信它与操纵或缩放DBL_EPSILON 有关,但我显然希望“有偏差”的结果至少超过“精确”结果 - 在 IEEE-754 算术假设下可以证明。
是的,我查看了 Goldberg 的论文,并寻找了一个可靠的解决方案。 请不要建议操纵舍入模式。理想情况下,我希望得到对浮点定理非常了解的人的回答,或者知道一个很好的示例。
编辑:澄清一下,(((1.0 + DBL_EPSILON) * x) / y) 或表单(((1.0 + c) * x) / y) 不是先决条件。这只是我使用的一种“可能足够好”的方法,但没有为它提供坚实的基础。我可以声明分子和分母不会是特殊值:NaNs、Infs 等,分母也不会是零。
【问题讨论】:
-
让我看看我是否正确理解了你的问题;您正在寻找
k的值以确保(((1.0 + k) * x) / y) - (x / y) >= threshold在双精度算术中?这听起来不对,所以我想我没有理解你的问题.. -
@OliCharlesworth - 不。他想要一个
k和一个操作f以便执行操作:f(x,y,k)使用双精度算术尽可能接近“精确”(无限精度)x/y的值而不低于它。目前,fhappens 是((1.0 + k) * x) / y,khappens 是 DBL_EPSILON,但他希望有比这更紧密的界限。 -
@BrettHale:我不知道它是否受到限制,但如果这是你需要的行为,那么我认为你给自己带来了不必要的困难(你不知道绝对epsilon 直到你知道结果的大小,直到你完成除法你才知道)。为什么不计算
x/y,然后然后进行向上舍入? -
你为什么不想操纵舍入模式。它可以解决我所理解的问题。另一个问题,可以假设 x > y 或 x >= y?
-
我同意@AProgrammer,为什么不
_controlfp_s或__asm fldcw或_FPU_SETCW?不就是为了这个吗?
标签: c floating-point floating-accuracy ieee-754