組み込みシステムの C++ コードで大きな数を使用します。幸いなことに、コンパイラは long double を認識します。
標準ライブラリ、boost ライブラリ、gnu 数学ライブラリなどは使用できません。また、システムには float 数学 cpu が組み込まれていません。
長い二重オーバーフローを検出するにはどうすればよいですか?
2 に答える
「大きな数」が必要であるというあなたの状態ですが、これは必ずしも long double の使用が示されていることを意味するものではありません。私が知っているほとんどの組み込みアプリケーションでは、long double が選択されているのは、精度が向上するためです。つまり、範囲が広がるためよりも、小数の分解能が向上します。
また、実装が通常の浮動小数点ライブラリや機能をほとんど提供していないと述べています。これらのステートメントに基づいて、完全に機能する浮動小数点機能が必要かどうかを質問します。懸念事項が「大きな数」に限られている場合は、コンパイラがlong longデータ型 (64 ビット整数) を提供しているかどうかを確認してください。
浮動小数点機能が必要な場合は、固定小数点の実装を検討してください。long long を想定すると、数値を 48.16 形式で表すことを選択できます。これにより、10 進数の右側に 16 ビットの ~2.8x10^14 の数値が許可されます。(固定小数点計算の概要が必要な場合は、ここから始めてください。)
背景の問題のいくつかに対処したので、元の質問を見てみましょう。unsigned int のオーバーフローを検出したい場合 (埋め込み作業ではよくこれを行います)、最新の結果を以前の結果と比較するだけで十分です。たとえば、私のアプリケーションでは、外部クロックによって駆動される 16 ビット カウンターを定期的に検査する必要があります。現在の観測値が最後の観測値よりも小さい場合、16 ビット カウンターがオーバーフローしたと見なすことができ、それに応じてアクションを実行できます。long long integer データ型を使用して大きな数値を実装する場合、同様の戦略を適用してオーバーフローを検出できます。
標準の C++ ではないため、特定の環境で提供されるメソッドに依存する必要があります。組み込みシステムの製造元は、その方法を文書化する必要があります。彼に尋ねる。