一般单元测试中的浮点比较

时间:2016-01-14 07:53:45

标签: c++ algorithm unit-testing floating-point numeric

我知道这个问题已经讨论了很多。我在网上搜索并自己想出了一个算法。我想知道它是否可以作为一般单元测试中的默认实现(不是一些严肃/专业的数字测试)。

public function save($filename, $overwrite = true)
{

    if ($this->html)
    {
        $this->snappy->generateFromHtml($this->html, $filename, $this->options, $overwrite);
    }
    elseif ($this->file)
    {
        $this->snappy->generate($this->file, $filename, $this->options, $overwrite);
    }

    return $this;
}

刚发现一个漏洞。最后一个陈述应该是

bool equal_to(double x, double y) {
  using limits = std::numeric_limits<double>;
  auto mag_x = std::abs(x);
  auto mag_y = std::abs(y);
  if (mag_x < mag_y) {
    std::swap(x, y);
    std::swap(mag_x, mag_y);
  }
  auto eps = limits::epsilon() * mag_x;
  auto lb = x - eps;
  auto ub = x + eps;
  return lb < y && y < ub;
}

以防return (x == y) || (lb < y && y < ub);

1 个答案:

答案 0 :(得分:0)

不,这还不够。您的eps太低,可能应该与用于生成xy的步骤数相乘(尽管这些错误经常取消,但这不是&# 39;保证)。

此外,您的舍入效应可能会因灾难性取消而放大。如果x约为0.1,因为它计算为10.0 - 9.9,那么您应该使用limits::epsilon * (10+9.9)。你过于乐观了大约100倍。