假设这么多:
我正在使用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));
所以问题是......这是天才的一击(不是说它还没有被认为或任何东西)或完全浪费时间?
答案 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位添加到高产品中。最后,将最后一个产品添加到高端产品中。
屁股的巨大痛苦,但它适用于价值观的任何精确度。