- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为了简化问题,假设我想计算表达式 a / (b - c)
在 float
s。
为了确保结果有意义,我可以检查 b
和 c
相等:
float EPS = std::numeric_limits<float>::epsilon();
if ((b - c) > EPS || (c - b) > EPS)
{
return a / (b - c);
}
但我的测试表明,如果可能的话,仅仅保证有意义的结果或不提供结果是不够的。
a = 1.0f;
b = 0.00000003f;
c = 0.00000002f;
结果:不满足 if 条件,但表达式会产生正确的结果 100000008(至于浮点数的精度)。
a = 1e33f;
b = 0.000003;
c = 0.000002;
结果:满足 if 条件,但表达式产生没有意义的结果
+1.#INF00
.
const float INF = numeric_limits<float>::infinity();
float x = a / (b - c);
if (-INF < x && x < INF)
{
return x;
}
但是 epsilon 是为了什么,为什么每个人都说 epsilon 好用呢?
最佳答案
“在处理浮点数时必须使用 epsilon”是对浮点计算有肤浅理解的程序员的下意识 react ,用于一般比较(不仅是零)。
这通常没有帮助,因为它没有告诉您如何最小化舍入误差的传播,也没有告诉您如何避免取消或吸收问题,甚至当您的问题确实与两个浮点数的比较有关时,它没有告诉您 epsilon 的什么值适合您正在做的事情 。
如果您还没有阅读 What Every Computer Scientist Should Know About Floating-Point Arithmetic ,这是一个很好的起点。此外,如果您对示例中除法结果的精度感兴趣,则必须估计先前舍入误差使 b-c
产生的不精确程度,因为确实如果 b-c
很小,那么小的绝对误差对应于大结果绝对错误。如果您只关心除法不应该溢出,那么您的测试(对结果)是正确的。没有理由使用浮点数测试空除数,您只需测试结果是否溢出,这会捕获除数为空和除数太小以致结果无法表示的两种情况任何精度。
关于舍入误差的传播,有 specialized analyzers 可以帮你估计,因为手工做是一件很繁琐的事情。
关于floating-point - "epsilon"真的能保证浮点计算中的任何东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2729637/
据说它会选择概率为 1-epsilon 的经验平均值最高的臂,在第 no 页中为概率编写的方程中,epsilon/k 是如何添加到它的(以及用于随机概率选择的 epsilon/k) :6篇论文Algo
据我所知,epsilon 标志着探索和利用之间的权衡。一开始,你希望 epsilon 较高,这样你才能取得大的进步并学到东西。当您了解 future 的奖励时,epsilon 应该衰减,以便您可以利用
教科书教我们使用 epsilon (ε) 编写正则表达式符号,但是如何将该符号直接转换为代码而不必完全修改我的正则表达式? 例如,我将如何编写这个正则表达式来捕获以 a 开头或结尾的所有小写字符串。
我在想 ES6 中的相等是封闭的情况,就像这个基本的例子: x = 0.2; y = 0.3; z = 0.1; equal = (Math.abs(x - (y - z)) < Number.EPS
有一个最接近零的FLT_MIN常量。如何最接近某个数字值? 举个例子: float nearest_to_1000 = 1000.0f + epsilon; // epsilon must be th
这是一张图片:http://i.imgur.com/MRvz24u.gif 所以我可以说出问题是什么,我用于球坐标的 epsilon(或任何符号)重复出现。所以我计算点数的方式是: double th
我正在尝试以最小值分隔两个等值的 double 。上下文是一个事件模拟。我不希望事件同时发生,因此我将设置为发生新事件的时间增加了一个最小值。 (这很烦人,经常发生(自行实现的随机数生成器),所以我实
sys.float_info.epsilon 返回什么? 在我的系统上我得到: >>> sys.float_info.epsilon 2.220446049250313e-16 >>> sys.flo
我正在尝试计算 float 类型的 epsilon 值的近似值(我知道它已经在标准库中)。 这台机器上的 epsilon 值是(打印有一些近似值): FLT_EPSILON = 1.192093e-
为什么 Decimal 数据类型没有 Epsilon 字段? From the manual ,decimal 值的范围是 ±1.0 × 10e−28 到 ±7.9 × 10e28。 The desc
我编写了一个类,用 Java 中的两个 double 来测试相等、小于和大于。我的一般情况是比较可以精确到半美分的价格。 59.005 与 59.395 相比。我为这些情况选择的 epsilon 是否
什么是最小的浮点值 A 使得 (x = 0 && pOppositeToCurrentCave.hasLeftVertexTo(otherLeftX)) { otherLeftX = pOpp
为了简化问题,假设我想计算表达式 a / (b - c)在 float s。 为了确保结果有意义,我可以检查 b和 c相等: float EPS = std::numeric_limits::epsi
我正在进行一些几何计算,这需要我比较基于 double 的坐标。我通常通过添加一些人工 epsilon 来处理这种情况下的浮点不准确问题。这很常见,并且有很多关于该主题的信息。 http://floa
根据维基百科,不同精度数据类型的布局是 single precision :指数 (e):8 位,小数 (f):23 位 double precision :e:11位,f:52位 quadruple
我让球弹来弹去,每次它们碰撞时,它们的速度矢量都会因恢复系数而降低。 现在我的球 CoR 是 0.80。因此,在多次弹跳之后,我的球已经“停止”滚动,因为它们的速度已经变得非常小了。 在什么阶段检查速
我在编码方面的经验很少,并且正在学习 Python 类(class)。我被要求在某个所需的 epsilon 内近似无穷总和,以便该系列中两个连续项之间的差值小于 epsilon。 我搜索了一下,发现了
我试图了解 LR1 解析器的工作原理,但我想到了一个奇怪的问题:如果语法包含 Epsilons 怎么办?例如:如果我有语法: S -> A A -> a A | B B -> a 很清楚如何开始: S
我的团队正在使用财务软件,该软件在 C# float 加倍时公开货币值(value)。有时,我们需要比较这些值以查看它们是否等于零,或者是否低于特定限制。当我注意到此逻辑中的意外行为时,我很快了解到浮
在this question中,我编写了一个脚本,以查找将值存储为总和的一部分然后再次返回时可能出现的最大错误。 我发现最大错误与Number.EPSILON有关: maximumError / Nu
我是一名优秀的程序员,十分优秀!