1

私が持っているマイクロコントローラは、ASIC IC によって固定小数点形式 Q24 (24 ビット) で生データを提供します。

私は小数に変換する必要があります

Actual value = raw_data*LSB

どこ

LSB = 150/[( (2^24) - 1 )*0.6 ] = 150/10066329 = 1.49011E-5

範囲生データは 0 ~ 10066329

実際の値を uint 32bit で計算し、小数点以下 2 桁または 3 桁の精度を維持したいと考えています。

たとえば、フルスケールの生データが10066329の場合、小数点以下 2 桁の精度の実際の値は15000または になり、小数点以下 3 桁になります150000

これを行う方法は次のとおりです-スケールファクタ(ただし、データが32ビットでオーバーフローしないように生データの精度を下げる必要があります)-浮動小数点(MCUを効率的にしません)

どのオプションを選択すればよいですか?

ここにも投稿しました

4

1 に答える 1

0

中間の 64 ビット値を使用することで、完全な精度を維持しながら浮動小数点を回避できます。

// raw
unsigned int raw = 10066329;

// conversion
unsigned int actual_a = ((raw >> 6u) * (150000 >> 4u) / 10066329) << 10u;
unsigned int actual_b = (raw * (long long) 150000) / 10066329;

double actual_ref = raw * 150000.0 / 10066329.0;
printf("%.0f\n%u\n%u\n", actual_ref, actual_a, actual_b);

上記の例では、次の出力が得られます (すべて 32 ビット値)。

150000    // True value for reference
149504    // Value converted using 32 bit
150000    // Value converted using 64 bit

生データの最下位ビットを切り捨てる必要がある場合、ある程度の精度が失われる可能性があります (アプリケーションによっては、これは完全に許容される場合があります)。ただし、64 ビットを使用する場合、切り捨ては必要ありません。

于 2012-12-08T22:59:42.467 に答える