如果绝对或相对误差小于10 ^( - 6),您的答案将被视为正确

时间:2013-03-03 22:10:11

标签: c++ c algorithm

在许多编程问题中,提到了上述约束。 我在codechef以及SPOJ中看起来都是这样。

E.g。 Link-1Link-2等等。 (参见这两个示例链接中的OUTPUT部分)

这个约束是什么意思?我怎样才能确保输出指定了这个约束?

4 个答案:

答案 0 :(得分:10)

绝对错误是:

|computedAnswer - correctAnswer|

相对错误是:

|(computedAnswer - correctAnswer) / correctAnswer|

直观地,绝对误差是计算出的答案(或近似值)与正确(可能未知)答案的距离。相对误差是绝对误差与正确答案的比率。

因此,无论您是使用激光测距仪测量到月球的距离还是在狐狸小跑期间尝试正确放置左脚,在任何一种情况下您的绝对误差都可能是半米。对于月球距离测量,这将是相当不错的;对于狐狸小跑来说,它会让你开始与星星共舞。

答案 1 :(得分:1)

除了Ted Hopp所说的,减少错误的一个可能重要因素是通过以下方式最大限度地减少浮点漂移/不准确:

  • 通过简化/评估将对您的输入起作用的操作集来减少总浮点计算。 (例如尽可能简化数学表达式)。这是因为浮点错误会影响后续操作。
  • 使用最高精度(例如,双倍)进行计算。
  • 或者,您可以使用分数类型或更多数字声音类,然后在最后评估为浮点值。

答案 2 :(得分:1)

问题的观点是说:if:

sqrt((your_answer - their_answer)^ 2)< 1 * 10 ^ -6

然后你是“正确的”

将浮点值精确地比较是非常有问题的。这是因为有限精度机器中的舍入(即一些数学答案不能用有限数字表示,例如1.0 / 3.0)。

计算机上执行问题的许多解决方案都是迭代的。这意味着,您从第一次猜测开始,并计算改变猜测的程度。然后重复一遍,计算改变猜测的程度。重复此过程后,您更改猜测的数量将变得越来越小(它会收敛)。一旦变化小于某个指定金额,您可以认为您的答案已经收敛,现在您有一个“正确”的答案。梯度体面算法是这种技术的典型例子。我没有仔细查看提供的链接,但也许是为了获得答案,您需要一个迭代解决方案,在这种情况下,您应该使用1.0 * 10 ^ -6作为限制来测试您的解决方案是否已收敛。

http://en.wikipedia.org/wiki/Gradient_descent

您发布的网站链接似乎是一些问题,可以让他们自己使用数字方法:

http://en.wikipedia.org/wiki/Numerical_analysis

这似乎是一个有趣的网站,有一些具有挑战性的问题。

答案 3 :(得分:1)

这是一个简单的计算机问题:评估1/3。

如果您使用“普通”计算机数字,如浮点数,双精度等,那么您计算的1/3版本将不会是0.3333 ....,它将是0.333333333332或0.333333333334或类似的东西,如1/3不能精确地表示为浮点数或有限的十进制扩展。当然有可能将1/3评估为10 ^ -6的相对和绝对误差; 0.333333333332和0.333333333334均符合此准确度要求。

因此,这个要求只能在10 ^ -6范围内准确答案,这使得计算机解决方案可以使用浮点数和双重精度来解决没有使用浮点数和双精度的精确数值解的问题。实际上这几乎都是数字问题 - 大多数分数无法用数字计算;计算机使用近似值。