Я реализую модуль мульти-точности, и в этот момент я застрял в умножении.
Чтобы выполнить мой алгоритм, мне нужно умножить два беззнаковых операнда на 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);
}
Я не знаю, как получить доступ к каждой половине результата, чтобы сохранить их в нужных мне блоках памяти.
Обязан ли я использовать инструкции по сборке для умножения и их для хранения результата, или существует простой способ?
Просто используйте __int128
как предложено, большинство компиляторов поддерживают это:
__uint128_t mul64x64( uint64_t a, uint64_t b ) {
return ((__uint128_t)a) * ((__uint128_t)a);
}
Это приведет к умножению одной инструкции на архитектурах x64.
Это высокое слово, которое вам будет трудно вычислить:
(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-разрядном значении, и она будет потеряна.