将定点转换为实际值(十进制)

时间:2012-09-26 17:17:51

标签: fixed-point

微控制器我用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无效)

我应该选择哪个选项?

我还发布了here

1 个答案:

答案 0 :(得分: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位,则不需要截断。