我知道这个问题已经讨论了很多。我在网上搜索并自己想出了一个算法。我想知道它是否可以作为一般单元测试中的默认实现(不是一些严肃/专业的数字测试)。
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);
答案 0 :(得分:0)
不,这还不够。您的eps
太低,可能应该与用于生成x
和y
的步骤数相乘(尽管这些错误经常取消,但这不是&# 39;保证)。
此外,您的舍入效应可能会因灾难性取消而放大。如果x
约为0.1,因为它计算为10.0 - 9.9
,那么您应该使用limits::epsilon * (10+9.9)
。你过于乐观了大约100倍。