Двойное целочисленное умножение точности в C ++ - PullRequest
1 голос
/ 23 августа 2011

Существует ли какой-либо стандартный способ C ++ (например, библиотека классов), который обеспечивает целочисленное умножение с двойной точностью?Я имею в виду следующее: учитывая два целых числа без знака a, b, их умножение должно дать мне массив из двух целых чисел без знака {c, d}, таких что a * b = c + d * (UINT_MAX + 1)?

Ответы [ 5 ]

1 голос
/ 23 августа 2011

Вы были на правильном пути, разбив умножение на части, кроме случаев, когда у вас было h = (UINT_MAX + 1) / 2, это должно быть h = sqrt (UINT_MAX + 1). Если у вас есть 32-разрядные целые числа, например, h = 0x10000. Умножение на такую ​​константу - это то же самое, что и смещение влево на количество битов, поэтому ваше уравнение становится:

a0 = a & 0xffff;
a1 = a >> 16;
b0 = b & 0xffff;
b1 = b >> 16;
a*b = a0*b0 + ((a1*b0)<<16 + (a0*b1)<<16) + (a1*b1)<<32

Поскольку каждый компонент имеет размер 16 бит или менее, каждое умножение гарантированно вписывается в 32-разрядный результат без знака.

Сведения о сложении значений с множественной точностью см. В Как добавить и вычесть 128-битные целые числа в C или C ++, если мой компилятор не поддерживает их?

1 голос
/ 23 августа 2011

Класс BigInt позволяет работать с произвольными целыми числами точности.

1 голос
/ 23 августа 2011

Если вы ограничены стандартными библиотеками C ++, ответ - нет, такого предопределенного типа нет.Вы можете подтвердить, что здесь .@DumbCoder предложил альтернативу

1 голос
/ 23 августа 2011

Я не уверен, что это решит проблему, но в качестве грубого встроенного решения вы можете попробовать использовать unsigned long long int, что является 64-разрядным целым числом.

1 голос
/ 23 августа 2011
...