2012-02-20 18 views
2

あいまいなタイトルのお詫び。私の問題は次のとおりです。wの項目が1つ未満のベクトルを与えられた場合、2つめのベクトルdoubleのvは、合計が1未満(以下の再帰で計算されます)の正の値を持ち、uは正で、一sum(v)>1-uまで再帰浮動小数点計算

w(i) = RandomNumber(); //A random number from (0,1) - not necessarily uniform 
v(i) = v(i-1)*w(i)*(1-w(i-1))/w(i-1); 

を用いvを拡張します。問題はuが非常に小さくなる可能性があり、が(確率的に)減少しているので、それも小さくなることがあります。そして、w(i)も同様に近づくかもしれません。

これを実装する最も安全な方法は何ですか?精度のポイント:)

答えて

0

あまりにも多くのエラーなしで浮動小数点数を合計する一般的な方法は、それらを最小から最大まで合計することです。 v(i)の計算はv(i-1)のみに依存するため、過去の数値はソートされたツリー内に保持できます。再帰的な合計は各ノードに保存され、直前の値は別の変数に保存されます。新しい値を挿入するか、またはノードを再配置するときには、それらのポイントからツリーを上っていく合計を再計算する必要があります。各ノードでの合計は、まっすぐに追加することもできますし、カハンの和のようなビットをいくつか保持することもできます。

-1

v(i)を累積して1-uと比較するのではなく、1-uで始まり、負の数になるまで各v(i)を減らしますか?

+0

はい、おそらく、これは小さいuのためのOK近似を与えるでしょう(精度が良いということは> 0ですか)。私はもう少し考えなければならないだろう。 – MMM

+0

連続する2つの浮動小数点値の間の距離(floatまたはdoubleのいずれか)は値によって異なります。 0に近づくほど、この距離は小さくなります(これは内部表現によるものです)。役に立つかもしれないブログ投稿のリストについては、http://randomascii.wordpress.com/category/floating-point/を参照してください。 – Asaf

+0

あなたは初めてあなたを誤解しました - 最終的な合計が1-uであることを暗示していると思っていましたが、これは明らかに正しくはありませんが、今あなたが意味するものを見ています。ありがとう – MMM