C ++中的双整数精度乘法

时间:2011-08-23 15:50:53

标签: c++ integer multiplication

是否有任何标准的C ++方式(例如类库)提供双精度的整数乘法?我的意思是:给定两个无符号整数a,b它们的乘法应该给我一个两个无符号整数{c,d}的数组,使a * b = c + d *(UINT_MAX + 1)?

5 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

如果您被限制在C ++标准库中,答案是否定的,没有这样的预定义类型。您可以确认here。 @DumbCoder提出了另一种选择

答案 2 :(得分:1)

我不确定这是否能解决问题,但作为原始的内置解决方案,您可以尝试使用unsigned long long int,这是一个64位整数。

答案 3 :(得分:1)

BigInt类允许您使用任意精度整数。

答案 4 :(得分:0)

你把这个乘法分成几部分是正确的,除非你有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位结果。

要同时添加多个精度值,请参阅How can I add and subtract 128 bit integers in C or C++ if my compiler does not support them?