質問

どのようにすることができます、今の時間に簡単に組み込みシステムで、必要な固定点の表現の時間を秒単位で、お時間の目盛は正確にexpressableる固定小数点フォーマットは何ですか?いを避ける累積誤差はこの状況です。

この問題は反応 この記事 にslashdot.

0.1秒感を表現してバイナリの固定点数、1/3感を表現して固定小数点数になります。他のバイナリの固定点の表現は、小さなエラーになります。例えば、ある8バイナリービット後のポイント(ieを整数値をスケールによる256),0.1倍256は25.6、四捨五入から25 26、エラーの順で-2.3%以+1.6%となっています。加バイナリのビットの後に、このエラーはできませんの排除します。

繰り返し、徐々にエラーが蓄積されていきます。

どのようにこの回避できるの?

役に立ちましたか?

解決

一つのアプローチは、一定のこの0.1秒の繰り返し添加することにより、時間を計算するために、単純な整数クロック・チック数を維持しようとすることはありません。通常、分裂が続く乗算を使用して、必要に応じてこのチックカウントは秒に固定小数点時間に変換することができます。中間表現に十分なビットを考えると、このアプローチは、任意の合理的なスケーリングを可能にし、エラーを蓄積しない。

現在のティックカウントが1024である場合、例えば、我々は、256で、次いで、10で割ることに乗じて(点後8ビットを有する固定小数点で)現在の時刻を取得することができ - 次いで、128を掛けることにより、同等又は5.いずれかの方法で割る、そこ誤差(部門の余り)であるが、残りは何の累積誤差はありません常に5未満であるため、エラーが制限されます。

他のヒント

別のアプローチは、整数乗算や除算が(これらの日はかなり稀取得すべきか)コストがかかりすぎると考えられている状況で有用であるかもしれません。これは Bresenhamsライン描画アルゴリズムするからアイデアを借ります。あなたは、固定小数点(というよりもダニ・カウント)で現在時刻を維持しますが、誤差項を保ちます。誤差項が大きくなりすぎた場合、あなたは、このように蓄積するエラーを防止し、時間値に補正を適用します。

8ビットアフター・ポイント例では、0.1秒の表現は、各ステップで6の誤差項(残り)と(10分の256)25であり、我々はエラーアキュムレータに6を加えます。これに基づき、これまで、最初の2つのステップがあります...

Clock  Seconds  Error
-----  -------  -----
 25    0.0977    6
 50    0.1953   12

第二工程では、誤差値がオーバーフローしている - したがって、我々は、クロックを増分し、エラーから10を減算10を超えていました。これは、エラー値が10以上になるたびに起こります。

そのため、実際の配列がある...

Clock  Seconds  Error  Overflowed?
-----  -------  -----  -----------
 25    0.0977    6
 51    0.1992    2      Yes
 76    0.2969    8
102    0.3984    4      Yes

が存在エラー(エラー値がゼロである場合にのみクロックが正確に正しい)ほとんど常にあるが、誤差が小さい定数によって制限されます。クロック値には累積誤差がありません。

正確には十分な速さで繰り返し追加ダニ期間値の切り捨てによって引き起こされた累積損失を補償するために -

ハードウェアのみのソリューションは、ハードウェアクロックは非常にわずかに高速に実行するためにダニのために配置することです。すなわち、固定小数点ティック持続時間値を正確に正確であるように、ハードウェア・クロック・ティック速度を調整、である。

こののみ動作クロックに使用される唯一の固定小数点形式がある場合。

なぜ、0.1秒カウンタを持っており、すべての10時間は、あなたの秒カウンタをインクリメントし、0に戻し0.1カウンタをラップしませんか?

この特定のインスタンスは、単に時間を数十分の一秒間(ミリ秒など、時間スケールに適合したものとします。これに小さなシステムの制御システム。

う時間的価値の100時間が蓄積することもできる 3_600_000 ダニ-ゼロエラー以外のエラーが紹介しているページがあります。

問題はこの簡単な手法について:

  • 必要なものは大きい。例えば、利用64ビットカウンターは32ビットカウンター
  • すべての計算を意識せざるを得なくなるのに使用されるユニットのこの地域で最も問題となることがありようにしていることでこの問題を用いたカウンターに統一ユニットです。例えば、この特定のカウンターのニーズ10目盛りが、別のカウンターがミリ秒の精度。その場合には、いろいろなことで、カウンターミリ秒の精度でも利用できるものの一つないことが必要な精度。

もっ遊びにその他の技本とタイマーな'通常'.例えば、私たる装置に必要なデータ取得が発生300しました。ハードウェアのタイマーを焚き、ミリ秒もはやスケールのミリ秒のタイマーを対象としています1/300秒単位です。いったロジカル(論理的)であることを行い、データの取得3,3、4目盛の取得から漂う。

が必要な場合の対応ハード時にエラー、そして必要以上の時間源の利用と保全体の時間ます。お客様の必要に応じてこの簡単なやかです。

だが実施した過去のンクリメント値で表現できない精密に固定小数点形式で表現できるとして含む複数の分子を同定できた。(これは同様にしてください""トラックのエラー値"ソリューション.)

実際にこの場合、問題は若干異なるが、概念的に同様の問題な固定点としての表現などが派生するタイマーからクロック源となり、完璧がある。またハードクロックを刻で32,768Hz(共通腕結晶に基づく低消費電力タイマー.また、ミリ秒のタイマーです。

をミリ秒単位のタイマーは増加毎32.768ハードウェアダニ.最初の近似が増加33ハードウェアダニとなり、名目0.7%エラーになります。でも、こ0.768は768/1000、96/125、これを実行する事ができます。:

  • 常に変数を"数"の値です。開始で0になります。
  • のハードウェアのタイマーカウント32.
  • がtrue:
    • 増分値をミリ秒単位のタイマー.
    • 追加の96の"数"の値です。
    • 場合は"分数"の値が>=125,減算125られた場合には、ハードウェアのタイマーカウントは33となった。
    • その他の数値は < 125)のハードウェアのタイマーカウント32.

ことがあります短期的には"ジッター"のミリ秒のカウンター(32vs33ハードウェアダニ)が、長期的な平均する32.768ハードウェアダニ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top