Умножение с очень большими операндами

Я реализую модуль мульти-точности, и в этот момент я застрял в умножении.

Чтобы выполнить мой алгоритм, мне нужно умножить два беззнаковых операнда на 64 бита, используя микроархитектуру Haswell, и сохранить результат в блоке памяти.
Я делаю реализацию с использованием ‘g ++’, а другую более эффективную, используя ‘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);
}

Я не знаю, как получить доступ к каждой половине результата, чтобы сохранить их в нужных мне блоках памяти.
Обязан ли я использовать инструкции по сборке для умножения и их для хранения результата, или существует простой способ?

3

Решение

Просто используйте __int128 как предложено, большинство компиляторов поддерживают это:

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

Это приведет к умножению одной инструкции на архитектурах x64.

4

Другие решения

Это высокое слово, которое вам будет трудно вычислить:

(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 + бд

Термин, выделенный жирным шрифтом, обозначает часть продукта, которую вы не сможете представить в 64-разрядном значении, и она будет потеряна.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector