3

私の質問-パート1:浮動小数点数が(Matlabの)「整数」であるかどうかをテストするための最良の方法は何ですか?

パート1の現在の解決策は明らかに、isintegerこれは値ではなく要素のタイプをテストするためです。したがって、現在、次のような問題を解決しています。

    abs(round(X) - X) <= sqrt(eps(X))

しかし、おそらくもっとネイティブなMatlabメソッドがありますか?

私の質問-パート2:私の現在の解決策が本当に最善の方法である場合、推奨される一般的な許容範囲があるかどうか疑問に思いましたか?上からわかるように、私はを使用sqrt(eps(X))していますが、これには理由がありません。たぶん私はただ使うべきですかeps(X)、それとも多分5 * eps(X)?どんな提案でも大歓迎です。

例: Matlabで、sqrt(2)^2 == 2Falseを返します。しかし実際には、その論理条件がTrueを返すようにしたい場合があります。sqrt(2)^2実際には等しいので、上記の方法を使用してこれを達成できます2 + eps(2)(つまり、の許容範囲内ですsqrt(eps(2))。しかし、これは常に許容範囲として使用する必要があることを意味しますか、またはeps(X)、などのより大きな許容範囲を使用する正当な理由がありますか?5 * eps(X)sqrt(eps(X))

更新(2012-10-31): @FakeDIYは、私の質問がこのSO質問の一部と重複していることを指摘しました(申し訳ありませんが、最初の検索でどのように見逃したかわかりません)。これを踏まえて、質問の「許容範囲」の部分(そのリンクではカバーされていません)を強調したいと思います。つまりeps(X)、賢明な許容範囲です。それとも、のようなもっと大きなものを使用する必要が5 * eps(X)あります。もしそうなら、なぜですか?

更新(2012-11-01):回答ありがとうございます。質問のさまざまな側面に有意義に貢献していると感じたので、3つすべての回答を+1しました。私はEricPostpischilに回答の目盛りを付けています。その回答は、質問の許容範囲の部分を実際にうまく釘付けにしているからです(そして、現時点で最も多くの賛成を得ています)。

4

3 に答える 3

6

いいえ、推奨される一般的な公差はありません。

計算結果と数学的に理想的な結果の違いは、計算結果を生成した演算の関数です。これらの操作は各アプリケーションに固有であるため、計算結果のプロパティをテストするための一般的な規則はありません。

適切なテストを設計するには、計算中に発生した可能性のあるエラーを特定し、計算結果の結果のエラーの範囲を特定し、計算結果が理想的な結果(おそらく最も近い整数)とそれらの範囲よりも小さいかどうかをテストする必要があります。 。また、これらの境界がアプリケーションの要件を満たすのに十分小さいかどうかを判断する必要があります。(整数ではないものを整数として受け入れる緩和されたテストを使用すると、偽陰性[理想的な結果が整数になる整数としての結果の誤った拒否]は減少しますが、偽陽性[整数としての結果の誤った受け入れ]は増加します理想的な結果は整数ではありません]。)

(エラー境界がゼロであるかのようにテストすると、偽陰性が発生する可能性があることに注意してください。理想的な結果が整数でない場合、計算によって正確に整数の結果が生成される可能性があるため、エラー許容度はゼロであっても、この結果が整数であると誤って報告します。これがアプリケーションで受け入れられない場合は、そのような場合、計算を再設計する必要があります。)

アプリケーションの特定の知識がなければ、使用できる数値の許容誤差を述べることができないだけでなく、許容誤差が絶対的であるか、計算値に対して相対的であるか、または目標値に対して相対的であるかを述べることは不可能です。 ULP(精度が最も低い単位)で測定するか、他の方法で設定する必要があります。これは、さまざまな方法でエラーが計算に導入される可能性があるためです。たとえば、とに小さな相対誤差がaありab値が近い場合、a-b大きな相対誤差があります。さらに、cが大きい場合は、(a-b)*c絶対誤差が大きくなります。

于 2012-10-31T11:23:55.437 に答える
3

それはおそらく最も効率的な方法ではありませんが、私はこれに使用modします:

a = 15.0000000000;
b = mod(a,1.0)
c = 15.0000000001;
d = mod(c,1.0) 

戻りb = 0d = 1.0000e-010

ここで提案されている他の多くの選択肢があります:

MATLABで整数をテストするにはどうすればよいですか?

私も比較するという考えが好き(x == floor(x))です。

于 2012-10-31T09:59:02.680 に答える
1

1)私は歴史的にあなたの方法を単純な許容範囲で使用してきましたeps(X)。しかし、modメソッドは私に興味を持ったので、SteveEddinstimeit関数を使用してカップルのベンチマークを行いました。

f = @() abs(X - round(X)) <= eps(X);
g = @() X == round(X);
h = @() ~mod(X,1);

のような単一の値の場合X=1.0、あなたの値が最も速く表示されます。

timeit(f) = 7.3635e-006
timeit(g) = 9.9677e-006
timeit(h) = 9.9214e-006

ただし、ベクトルの場合は、のようX = 1:0.01:100に、他の方法の方が高速です(ただし、ラウンドはmodよりも優れています)。

timeit(f) = 0.00076636
timeit(g) = 0.00028182
timeit(h) = 0.00040539

2)エラーバウンドは実際には問題に依存します。他の答えは、私ができるよりもはるかにうまくこれをカバーしています。

于 2012-10-31T22:44:56.553 に答える