2011-01-02 5 views
4

浮動小数点数を比較できない理由、仮数と指数のバイナリ表現について知っていますが、私は専門家ではありません。私は何かに出くわしを得ることはありません:浮動小数点数の乗算よりも除算が大きく異なる理由

はつまり、あなたが何か持って言うことができます:異なる結果をもたらすことができる私の知識異なるプへ

float denominator, numerator, resultone, resulttwo; 

resultone = numerator/denominator; 

float buff = 1/denominator; 

resulttwo = numerator * buff; 

を、これは珍しいことではありません。しかし、いくつかのエッジケースでは、これらの2つの結果は大きく異なるようです。

float a = (facetSlopeRMS * facetSlopeRMS * pow(clampedCosHalfNormal, 4)); 
facetDlopeDistribution = exp(b/c)/a; 

なぜそれがないと

float a = 1/(facetSlopeRMS * facetSlopeRMS * pow(clampedCosHalfNormal, 4)); 
float b = clampedCosHalfNormal * clampedCosHalfNormal - 1.0; 
float c = facetSlopeRMS * facetSlopeRMS * clampedCosHalfNormal * clampedCosHalfNormal; 

facetSlopeDistribution = a * exp(b/c); 

利回りは非常に、非常に異なる結果:クック - トーランスlighitngモデルのベックマンファセット傾斜分布を計算私のGLSLコードで、より具体的には?式の第2の形式は問題があります。

式の2番目の形式を色に追加しようとすると、式が常に正の数になるはずですが、黒色になります。無限になっていますか? NaN?もしそうなら、なぜですか?

+0

これはあなたにとって興味深いかもしれません: http://www.cs.princeton.edu/introcs/91float/ –

答えて

6

私はあなたの数学を詳細には理解しませんでしたが、小さな誤差はこれらのすべての力と指数によって簡単にポンプアップされることに注意する必要があります。すべての変数varvar + e(var)(紙面にある)に置き換えて試してみて、エラーの原因となるため、ステップ間を単純化することなく、合計エラーの式を導き出す必要があります。

これは、グリッドがシミュレートされたフローと正しく整列していない場合に、「数値拡散」のようなものを観察できる、計算流体力学における非常に一般的な問題です。

したがって、最も大きなエラーの原因を明確に把握し、数値エラーを最小限に抑えるためにできるだけ方程式を書き直してください。

編集:明確にする、たとえば

はあなたには、いくつかの変数xと表現y=exp(x)を持っていると言います。 xのエラーはe(x)と表示され、x(例:e(x)/x < 0.0001ですが、使用するタイプによって異なります)と比較して小さいです。そして、あなたは

e(y) = y(x+e(x)) - y(x) 
e(y) ~ dy/dx * e(x) (for small e(x)) 
e(y) = exp(x) * e(x) 

だから周りx=0本当に何も問題はありませんことを意味し、exp(x)の絶対誤差の倍率があることを言うことができます(ない驚き、その時点でexp(x)の傾きがxのことと等しいので)、大きなxの場合はこれに気づくでしょう。

相対誤差は、その後xに相対誤差ながら

e(y)/y = e(y)/exp(x) = e(x) 

だろうので、あなたが相対誤差にxの要因を追加

e(x)/x 

ました。

+0

最終的な方程式は間違っていますが、相対誤差は変わってきましたが、 'exp(x)'ではなく 'x'の要素です。 –

+0

@Benありがとう、その1つを修正しました。 – mvds

+0

ありがとう!それは非常に良い説明です。 私の問題はそれよりも深かったことが分かりましたが、今はすべて解決されています。これは間違いなく知り、常に目が離せないものです。 –

関連する問題