2011-11-10 4 views
3

申し訳ありませんが、これはイメージに関するものではありません。質問を正しく行う方法がわかりません。C++コードで高解像度の精度を一時的に維持する方法

私の質問は、私はC + +コードを書いて、計算しています。

a=b*cos(c) 

bゼロからその振幅に時間的に変化する、bmaxと言います。 (実際には、b=bmax*sin(t)

しかし、bが非常に小さい場合、結果はaであり、分析結果から徐々に逸脱しています。

浮動小数点の切り捨てを避けるために、非常に高い解像度の結果を保持する方法が不思議です。

+2

徐々に、具体的にどのように逸脱していますか?絶対誤差の点では?相対的なエラー?どのように参照を計算していますか? –

+1

また、 'cos(c)'は無関係ですか?この質問の目的のために、 'cos(c)'を 'k 'に置き換えることができますか? –

+2

フロートやダブルスを使用していますか? – GazTheDestroyer

答えて

3

徐々に逸脱していると言えば、そこにエラーが蓄積されているように見えます(投稿したコードには何も明白ではありません)。それが好きな再書き込みなど

#include <iostream> 

int main() { 
    unsigned short counter; 
    float val = 0; 
    while (counter++) { 
    val += 0.001f; 
    std::cout << val << "\n"; 
    } 
} 

:たとえば、このコードではエラーがwhileループの周りのすべての反復で蓄積しvalのみに依存して

#include <iostream> 

int main() { 
    unsigned short counter; 
    while (counter++) { 
    float val = counter * 0.001f; 
    std::cout << val << "\n"; 
    } 
} 

は、この誤差の蓄積を引き起こすことはありません。 (正確に表現可能な)整数であり、以前の値であるvalではなく、それぞれ小さな誤差が導入されています。

+0

ありがとうございます。メッシュポイントの動きはこのように計算されるので、これは累積誤差だと思っています....方法は、Aがolf位置、Bが新しい位置、Bが目標関数から計算される正確な位置であったはずです。だから毎回現在の位置は単に "A +(B-A)"です。だから私の理解は、それがB 'の精度に関連しているということです。それが私が尋ねた理由です。 – Daniel

+0

'A'が古い位置で、' B'が新しい位置で、新しい位置の計算で 'A'(または変更前に' B')を使用すると、この種のエラーが発生します。 – Flexo

+0

ありがとう、もし私が最初のやり方でやらなければならないのなら、別の解決策がありますか?私は現在、基本クラスについては何もできないコードを作成しています。これは、これまでのところ、(BA)値を提供することです。つまり、各タイムステップDelta = BA 。私はあなたの答えから、少数と別の少数の間の加算または減算を避けるために最善の努力をするべきだと理解しています。しかし、これまで私は選択肢がありません。 :( – Daniel

0

もう一つの考え方は、可能な限り整数単位で値を保持することです。必要なときにのみ変換します。

例:

unsigned long value; 
const unsigned long scale_factor = 1E6; 

// Cosine returns floating point, so convert it to fixed point. 
unsigned long temp = cos(c) * scale_factor; 

// Reduce propagation of floating point error, by using integral arithmetic. 
value = value * temp; 
value *= b; 

別の方法としては、デルタが非常に小さい場合のために、独自のルックアップや補間テーブルを持つことです。

関連する問題