【问题标题】:Compare doubles in c++比较 C++ 中的双精度数
【发布时间】:2016-06-28 14:17:48
【问题描述】:

我想确定一个点是否在圆内。 所以我这样做:

(x - center_x)^2 + (y - center_y)^2 < radius^2

但我的坐标是double,我想我应该用 epsilon 来做,所以是 fabs ((x - center_x)^2 + (y - center_y)^2 - radius^2 ) < EPS 更好?

【问题讨论】:

标签: c++ compare double


【解决方案1】:

当您使用 <> 进行比较时,您不需要 epsilon,这些都很好。你需要它而不是==。在您的情况下,您刚刚向半径添加了少量,这可能是不可取的。 另请注意^pow(a, b) 不同。

【讨论】:

  • 谢谢,我知道我应该使用EPS==,但一直想知道<>。这让我很清楚! PS我知道我不能使用^作为战俘:P
  • 这两种情况都比pow(x, 2) + pow(y, 2) 更好,pow(x, 2) + pow(y, 2) 只进行乘法运算,避免复杂的对数计算。
【解决方案2】:

您不能在 C++ 中为此使用“^”。 而不是(x - center_x)^2 + (y - center_y)^2 < radius^2(x - center_x)*(x - center_x) + (y - center_y)*(y - center_y) < radius*radius。 坐标双倍也没问题。

【讨论】:

  • 我真的不认为这是代码,而是 OP 使用的公式。
  • @NathanOliver,无论哪种情况,SO 规则都建议发布完整的可测试代码,因此 Shiro 是正确的,假设 OP 正在尝试使用他发布的公式。
【解决方案3】:

没有。正如其他人所提到的,C 中的运算符^ 是按位排他的,或者不是幂。但是你可以使用内联函数:

inline double Sqr(double x) {return x*x;}
// ...
if (Sqr(x - center_x) + Sqr(y - center_y) < Sqr(radius)) // ...

至于你的问题,

fabs (Sqr(x - center_x) + Sqr(y - center_y) - Sqr(radius) ) < EPS

表示 (x,y) 在圆周上

【讨论】:

    【解决方案4】:

    视情况而定。

    朴素有序不等式比较通常最适合测试浮点值是否在阈值的一侧。

    由于浮点错误,应该在阈值一侧的结果可能会在另一侧结束。如果确保没有误报很重要,同时增加误报的机会,那么您建议的替代方案可能是合适的。

    请注意,当输入值的幅度发生变化时,基于常数 epsilon 的误差补偿无效。

    【讨论】:

      猜你喜欢
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2016-12-19
      相关资源
      最近更新 更多