定点乘法“解决方案”,疯狂还是可行?

时间:2010-05-26 15:10:43

标签: fixed-point

假设这么多:
我正在使用16.16定点系统 系统是32位 CPU没有浮点处理器 对于任何大于1.0 * 0.4999

的任何东西,溢出都非常迫在眉睫

做出最后一个假设...让我说我正在工作的值不会高到导致此操作溢出...

//assume that in practical application
//this assignment wouldn't be here as 2 fixed values would already exist...
fixed1 = (int)(1.2341 * 65536);
fixed2 = (int)(0.7854 * 65536);

mask1 = fixed1 & 0xFF; //mask off lower 8 bits

fixed1 >>= 8; //keep upper 24 bits... assume value here isn't too large...

answer = (((fixed2 * fixed1) >> 8) + ((fixed2 * mask1) >> 16));

所以问题是......这是天才的一击(不是说它还没有被认为或任何东西)或完全浪费时间?

1 个答案:

答案 0 :(得分:1)

重新编辑 - 因为我错了:)

看起来你正试图通过使用额外的var来获得更高的精度?

如果你确实试图提高精度,那么这可行,但为什么不使用整个int而不只是8位呢?

好的,根据您的评论,您想知道如何在32位处理器上执行64位精度muls。最简单的方法是,如果你下面的处理器有一个很长的乘法运算。如果它是一个ARM,你很幸运,并且可以使用很长时间来做你的mul然后移出你的超出界限并完成。

如果没有,你仍然可以进行很长时间的乘法,并让编译器编写器为您处理繁重的处理溢出。这些是最简单的方法。

如果做不到这一点,你可以做4个16位乘法和一堆加法和移位:


// The idea is to break the 32-bit multiply into 4 16-bit 
parts to prevent any overflow.  You can break any 
multiply into factors and additions (all math here is unsigned):
      (ahi16)(alo16)
X     (bhi16)(blo16)
--------------------
      (blo16)(alo16)  - First  32-bit product var
  (blo16)(ahi16)<<16  - Second 32-bit product var (Don't shift here)
  (bhi16)(alo16)<<16  - Third  32-bit product var (Don't shift here)
+ (bhi16)(ahi16)<<32  - Forth  32-bit product var (Don't shift here)
--------------------
Final Value.  Here we add using add and add 
with carry techniques to allow overflow.

基本上,我们的产品很少,产品也很高。低产品被分配了第一个部分产品。然后添加向上移动的2个中间产品。对于每个溢出,您将1添加到高产品并继续。然后将每个中间产品的高16位添加到高产品中。最后,将最后一个产品添加到高端产品中。

屁股的巨大痛苦,但它适用于价值观的任何精确度。