誤った入力 (一部の値にエラーがある) から正しい結果 (ある値が別の値より大きいかどうか) を計算する方法を尋ねています。明らかに、これは一般的に不可能です。誤った入力は、誤った出力を生成します。ただし、特定の状況では、何かを救うことができます。以下では、1 つの状況について説明します。
理想的な値aとbを近似するいくつかの と を計算しa
たとします。ここで、 aとbは、計算が正確な数学で行われた場合の結果です。また、 a – e a ≤ ≤ a + e aおよびa – e b ≤ ≤ b + e bとなる誤差範囲e aおよびe bがわかっているとします。言い換えれば、計算されたb
a
b
a
b
は、それぞれaとbの周囲の間隔内にあります。(実行される操作によっては、 a または b を含まない、接続されていない間隔でエラーが発生したり、エラーが発生したりする可能性がありa
ます。ただし、「行儀の良い」エラーがあると仮定します。)b
その場合、a
– e a > b
+ e bであれば、 a > bであると確信できます。
ただし、この条件をテストしてtrue
、それが成り立つ場合に戻るとします。次に、これが を返すたびに、 a > btrue
であることがわかります。ただし、 が返された場合、a > bが falseであるかどうかはわかりません。したがって、このテストは、 a > bであることが確実な場合にのみ何らかのアクションを実行する場合に適しています。ただし、これにより、 a > bの場合にアクションを実行できなくなることがあります。false
これらのケースを見逃したくないとします。次に、条件a
+ e a > b
– e bを考えます。a > bの場合、この条件は真でなければなりません。したがって、この条件をテストし、それが成立するときに目的のアクションを実行すると、そのアクションは常にa > bのときに実行されます。ただし、アクションは、 a > bではない場合にも実行される場合があります。
これは、あなたに選択の余地があることを示しています。計算に誤りがあると、アプリケーションが間違った動作をすることがあります。次を選択する必要があります。
- a > bが false の場合に、アプリケーションがアクションを実行することをどの程度許容できるか。それは常に受け入れられる/受け入れられないのですか、それとも a が b にどれだけ近いかによって異なりますか?
- a > bが true の場合に、アプリケーションがアクションを実行しないことをどの程度許容できるか。それは常に受け入れられる/受け入れられないのですか、それとも a が b にどれだけ近いかによって異なりますか?
満足のいく妥協点を見つけることができれば、条件を中間レベルに設定し、-e a - e bと+ e a + e bの間にある条件a-b > e
についてテストします。満足のいく妥協点が見つからない場合は、計算を改善してエラーを減らすか、何らかの方法でプログラムを再設計する必要があります。e
a
b
注: このシナリオの最終的なテストは、計算に小さな丸め誤差がある可能性があるためではありませa-b > e
ん。を計算する丸め誤差もあるかもしれませんが、とが互いに近くない場合に限られます。精度を気にする場合、が に近い場合、 の計算は正確です。a > b+e
b+e
a-b
a
b
e
a
b
a-b