2012-01-04 100 views
1

我有2比较二进制搜索内,但我不能在两个底下之间做出确切的偏好。我下面的两个样本之间振荡:二进制搜索和eps比较

for (int step = 0; step < 100; ++step) { 
    double middle = (left + right)/2; 
    if (f(middle) > 0) right = middle; else left = middle; 
} 

for (int step = 0; step < 100; ++step) { 
    double middle = (left + right)/2; 
    if (f(middle) > eps) right = middle; else left = middle; 
} 

f是单调递增函数,因为即使有小的EPS,有一种危险,即二进制搜索参数相应的错误会更大。另一方面,即使由于舍入误差我们的比较对于相等值不正确,二进制搜索仍然会正确收敛,因为相同的值可能只出现在一个点上,并且一切都将在非常接近它的点上正确。我想对此有一个想法。

+2

一个似乎找到0,另一个找到'eps'?问题是什么? – 2012-01-04 20:25:29

+2

另外,是否真的需要精确到.0000000000000000000000000000788860905 max-min?对于'double',你只需要52个循环? – 2012-01-04 20:27:58

+1

http://petr-mitrichev.blogspot.com/2011/06/binary-search-and-eps-in-comparisons.html有趣的是,这个博客属于谁发布的问题 – Rohan 2012-01-04 22:20:48

回答

1

从你的代码判断,你试图决定函数何时会有一个零值。第一种方法已经足够好了,因为它符合你的意图。似乎没有必要使用第二种方法。