0

a2 つの数値とbが等しいかどうかを確認したいとしましょう。a == b浮動小数点は不正確であるため、単純に をチェックするのではなく、通常は小さい数を選んで をチェックしたいことepsを知っていabs(a - b) < epsます。

しかし、それをチェックするときに浮動小数点エラーを考慮したい場合はどうすればよいa > bでしょうか? 私は単にではなくそれを推測しています

if (a > b) {
  ...
}

私は次のようなことをしたい:

if ((a > b) || abs(a - b) < eps) {
  ...
}

これは正しいです?aそれが「ほぼより大きい」ことを確認するにはどうすればよいbですか?

4

1 に答える 1

3

誤った入力 (一部の値にエラーがある) から正しい結果 (ある値が別の値より大きいかどうか) を計算する方法を尋ねています。明らかに、これは一般的に不可能です。誤った入力は、誤った出力を生成します。ただし、特定の状況では、何かを救うことができます。以下では、1 つの状況について説明します。

理想的な値abを近似するいくつかの と を計算しaたとします。ここで、 abは、計算が正確な数学で行われた場合の結果です。また、 ae a ≤ ≤ a + e aおよびae b ≤ ≤ b + e bとなる誤差範囲e aおよびe bがわかっているとします。言い換えれば、計算されたbababは、それぞれabの周囲の間隔内にあります。(実行される操作によっては、 a または b を含まない、接続されていない間隔でエラーが発生したり、エラーが発生たりする可能性がありaます。ただし、「行儀の良い」エラーがあると仮定します。)b

その場合、ae a > b+ e bであれば、 a > bであると確信できます。

ただし、この条件をテストしてtrue、それが成り立つ場合に戻るとします。次に、これが を返すたびに、 a > btrueであることがわかります。ただし、 が返された場合、a > bが falseであるかどうかはわかりません。したがって、このテストは、 a > bであることが確実な場合にのみ何らかのアクションを実行する場合に適しています。ただし、これにより、 a > bの場合にアクションを実行できなくなることがあります。false

これらのケースを見逃したくないとします。次に、条件a+ e a > be 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についてテストします。満足のいく妥協点が見つからない場合は、計算を改善してエラーを減らすか、何らかの方法でプログラムを再設計する必要があります。eab

注: このシナリオの最終的なテストは、計算に小さな丸め誤差がある可能性があるためではありませa-b > eん。を計算する丸め誤差もあるかもしれませんが、とが互いに近くない場合に限られます。精度を気にする場合、が に近い場合、 の計算は正確です。a > b+eb+ea-babeaba-b

于 2012-12-08T11:31:28.523 に答える