防止分数相乘时溢出

问题描述 投票:0回答:1

我尝试将整数乘以(17/64)向下舍入,但我无法处理溢出。 (我仅限于按位运算符 ( ~ & | << >> ! + )

#include <stdio.h>

int mulfrac(int x) {
    int mul17 = (x<<4) + x;
    int bias = (mul17 >> 31) & 63;
    int result = (mul17 + bias) >> 6;
    return result;

}

int main() {
    int test_values[] = {0, 1, -1, 3, -3, 17, -17, 11, -11, 64, -64, 128, -128, 100, -100, 400, 15, -6, 1234523590, -10000000, -10};
    int n_tests = sizeof(test_values) / sizeof(test_values[0]);

    for (int i = 0; i < n_tests; i++) {
        int x = test_values[i];
        int result = mulfrac(x);
        printf("mul_17_div_64(%d) = %d\n", x, result);
    }

    return 0;
}

我不知道该怎么做,因为我尝试了不同的方法但没有成功。我也不能使用 if 和 while

bit-manipulation
1个回答
0
投票

在划分之前添加偏差。为了避免负数的溢出问题,您需要正确舍入结果。这可以通过在除以 64 之前添加负数的“偏差”来完成。

© www.soinside.com 2019 - 2024. All rights reserved.