乘法与非常大的操作数

时间:2016-02-04 13:15:32

标签: c++ assembly multiplication bignum multiprecision

我正在实现一个多精度模块,此时我陷入了倍增。

要做我的算法,我需要使用Haswell微体系结构将两个64位无符号操作数相乘,并将结果存储在一个内存块中。 我正在使用&#; c ++'做一个实现。另一个更有效的使用' icpc'。

int main(){

    //Operands
    size_t a = 10000000000000000000 //Fit in 8 bytes
           b = 7;

    //To store the result;
    size_t dst[2];

    //Multiplication here... (Note that the multiplication result don't fit in 64bits. So, I need to save the result in two memory positions)

    dst[0] = //Store the less significative half..
    dst[1] = //Store the more significative half..


    //My function
    print_To_Screen(dst);
}

我不知道如何访问结果的每一半以将它们存储在我想要的内存块中。 我是否有义务使用汇编指令进行乘法,并将它们存储到结果中,还是存在一种简单的方法?

2 个答案:

答案 0 :(得分:4)

按照建议使用__int128,大多数编译器都支持它:

__uint128_t mul64x64( uint64_t a, uint64_t b ) {
    return ((__uint128_t)a) * ((__uint128_t)a);
}

这将转换为x64架构上的单指令乘法。

答案 1 :(得分:0)

高qword你将无法计算:

(a * 2 ^ 32 + b)*(c * 2 ^ 32 + d)

= a * 2 ^ 32(c * 2 ^ 32 + d)+ b(c * 2 ^ 32 + d)

= a * c * 2 ^ 64 +(ad + bc)* 2 ^ 32 + bd

以粗体显示的术语为您提供了无法用64位值表示的产品部分,并且会丢失。