微控制器我用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
答案 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位,则不需要截断。