2012-01-04 13 views
1

バイナリ検索で2つの比較がありますが、2つの下線の間に正確な優先順位を付けることはできません。私は、以下の2つのサンプルで間で振動:小さなEPSで、二分探索パラメータに対応するエラーがなるという危険がありますのでバイナリ検索と比較の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は、単調増加関数でありますずっと大きい。一方、丸め誤差のために同じ値の比較が正しくない場合でも、等しい値が1つの点にしか現れず、すべてが非常に近い点で正しいので、バイナリ検索は依然として正確に収束します。私はそれについて考えてみたいです。

+2

誰かが0を見つけたように見え、もう1人が 'eps'を見つけましたか?質問はなんですか? –

+2

また、max-minの.0000000000000000000000000000788860905%まで正確にする必要がありますか? 'double'では52個のループしか必要としません。 –

+1

http://petr-mitrichev.blogspot.com/2011/06/binary-search-and-eps-in-comparisons.html funnily十分に、このブログは質問を投稿した人に属します – Rohan

答えて

1

コードから判断すると、関数の値がゼロになるタイミングを決定しようとしています。最初の方法はすでに十分です。それはあなたの意図と一致しているからです。 2番目の方法を使う必要はないようです。