Двойное приведение значения в C для выполнения 64-битного умножения

Я пытаюсь реализовать IEEE 754 арифметику с плавающей запятой в программном обеспечении без использования FPU. Я много читал и нашел это решение для 64-битного умножения на этом сайте. Я понимаю большинство из них, но меня смущает, почему человек, который ответил на вопрос, использует значения 2 раза для одного и того же термина, и это не имеет смысла для меня. Я чувствую, что это имеет какое-то отношение к работе с старшими и младшими байтами решения, но я не вижу, как двойное приведение могло бы добиться этого. Вот код, о котором идет речь. Любая помощь, понимающая, почему это было сделано, была бы полезна.

uint64_t    a_lo = (uint32_t)a;
uint64_t    a_hi = a >> 32;
uint64_t    b_lo = (uint32_t)b;
uint64_t    b_hi = b >> 32;

uint64_t    a_x_b_hi =  a_hi * b_hi;
uint64_t    a_x_b_mid = a_hi * b_lo;
uint64_t    b_x_a_mid = b_hi * a_lo;
uint64_t    a_x_b_lo =  a_lo * b_lo;

uint64_t    carry_bit = ((uint64_t)(uint32_t)a_x_b_mid +
                         (uint64_t)(uint32_t)b_x_a_mid +
                         (a_x_b_lo >> 32) ) >> 32;

uint64_t    multhi = a_x_b_hi +
                     (a_x_b_mid >> 32) + (b_x_a_mid >> 32) +
                     carry_bit;

return multhi;

0 ответов

Другие вопросы по тегам