0

我正在尝试在微控制器中实现浮点运算,到目前为止我已经取得了很大的成功。

问题在于我在计算机中进行乘法运算的方式,它工作正常:

unsigned long long gig,mm1,mm2;
unsigned long m,m1,m2;
mm1 = f1.float_parts.mantissa;
mm2 = f2.float_parts.mantissa;

m1 = f1.float_parts.mantissa;
m2 = f2.float_parts.mantissa;



gig = mm1*mm2; //this works fine I get all the bits I need since they are all long long, but won't work in the mcu

gig = m1*m2//this does not work, to be precise it gives only the 32 least significant bits , but works on the mcu

所以你可以看到我的问题是,__muldi3如果我在gig = mm1*mm2那里尝试,微控制器会抛出一个未定义的引用。

如果我尝试使用较小的数据类型,它只会保留最低有效位,这是我不希望的。我需要产品的 23 msb 位。

有没有人对我如何做到这一点有任何想法?

4

3 回答 3

1

为简短的回答道歉,我希望其他人会花时间写一个更完整的解释,但基本上你做的完全就像你在纸上用手乘两个大数字一样!只是不是使用基数 10,而是使用基数 256。也就是说,将您的数字视为字节向量,并使用每个字节来处理“手动乘法”时对数字所做的操作。

于 2009-03-03T09:01:12.940 回答
1

__muldi3() 的 FreeBSD 实现中的注释很好地解释了所需的过程,请参阅muldi3.c。如果您想直接查看源代码(总是一个好主意!),根据评论,此代码基于 Knuth 的计算机编程艺术卷中描述的算法。2(第 2 版),第 4.3.3 节,第 278.(注意链接是第三版的。)

于 2009-05-01T02:31:55.833 回答
0

回到 Intel 8088(最初的 PC CPU 和我为其编写汇编代码的最后一个 CPU),当您将两个 16 位数字(32 位?哇哦)相乘时,CPU 将在两个不同的寄存器中返回 2 个 16 位数字 - 一个与 16 msb 和 lsb 之一。

你应该检查你的微控制器的硬件功能,也许它有类似的设置(如果有的话,你显然需要汇编代码)。

否则,您将不得不自己实现乘法。

于 2009-03-03T09:08:18.430 回答