0

我在 C 中实现 karatsuba 的乘法算法,在调试时我发现这个错误我无法解释:在每一步中,我将数字分成两半,我通过为我的数据类型分配适当的指针来做到这一点。当我输出我的值时,我得到了这个:

a->l: 8 a->u: 4 a->v: 0x51fc270 a: 4072
b->l: 8 b->u: 4 b->v: 0x51fc278 b: 6718

变成(对于a)

a->l: 2 a->u: 2 a->v: 0x51fc272 a: 00
b->l: 2 b->u: 2 b->v: 0x51fc270 b: 00

和(对于 b)

a->l: 2 a->u: 2 a->v: 0x51fc27a a: 00
b->l: 2 b->u: 2 b->v: 0x51fc278 b: 00

这两个输出之间没有写访问,前两个结构总是产生相同的输出。
有人可以解释这种行为吗?因为我真的迷路了。。

保存数据的结构如下所示

struct mp_type
{
    int l, u; //length of v and places used (length of number stored)
    char* v; //array which stores the value (the number)
};
typedef struct mp_type mp_int;

最后一个值是存储在数组 v 中的数字。

// high has lower address as low order digits are stored at the end of the array
mp_int low1, low2, high1, high2;
high1.l = high1.u = a->u / 2;
low1.l = low1.u = a->u - high1.u;
low1.v = a->v + low1.u;
high1.v = a->v;
high2.l = high2.u = b->u / 2;
low2.l = low2.u = b->u - high2.u;
low2.v = (b->v + low2.u);
high2.v = b->v;

我就是这样划分数字的。a->u 和 b->u 总是偶数。

在这里,您可以找到一个更精简的项目版本,它可以重现错误。

4

0 回答 0