在定点计算中使用小数部分

时间:2017-05-01 20:29:54

标签: c fixed-point

我的计算如下:

1472 / 48 = 30.666667
(30 * 48) = 1440
(0.666667 * 48) = 32

所以我得到的数字是1440和32,可以用第一次计算的实部和小数部分来计算。 使用下面的代码我找到了真实的部分,但是小数部分是按比例的。

#define SHIFT_AMOUNT    16
// 2 bytes is used to map divisions
#define SCALE_FACTOR    65535 // (2^16)
#define SHIFT_MASK      ((1 << SHIFT_AMOUNT) - 1)

uint32_t total_msgs = DATA_LENGTH << SHIFT_AMOUNT;
total_msgs /= PAYLOAD_SIZE;

uint8_t real_part = total_msgs >> SHIFT_AMOUNT; // 30
uint32_t decimal_part = total_msgs & SHIFT_MASK; // 43690

现在为了最后一次计算,我被困住了。我怎么从43690得到32(真的是((43690/65535)= 0.666667)?

2 个答案:

答案 0 :(得分:2)

解决此问题的常用方法是%运算符:

quotient = DATA_LENGTH / PAYLOAD_SIZE;
fraction = DATA_LENGTH % PAYLOAD_SIZE;

答案 1 :(得分:1)

正如其他人所提到的,由于您需要的值是商的整数部分,而余数来自除法,您可以分别使用/%运算符来执行此操作:

int quot = 1472 / 48;
int rem = 1472 % 48;

但是,使用同一对数字进行两次单独的操作,您可以使用div函数:

div_t result = div(1472, 48);
printf("quotient=%d, remainder=%d\n", result.quot, result.rem);

如果您经常执行此特定计算,这可能会增加速度,因为某些处理器(特别是x86)通过单个指令为您提供两个值,因此可能会将除法运算的数量减少一半。