TI中文支持网
TI专业的中文技术问题搜集分享网站

C2000两个32位数的乘法问题

使用的CCS3.3,芯片是2812,做两个32位数的乘法,结果总是不正确,可以确定不是因为溢出产生的错误。有没有人遇到过类似的情况。

关键部分代码如下:

long long a;

long long b;

long long C;

a = (int64)U;
b= (int64)I;
C = a * b;

U和I是型参,32位无符号整数。测试中U=229777,I =679190,用window的计算机算的值是156062240630,这个值应该是对的。乘数其中一个是10 的整数倍,积应该也是的。而上述代码算出来的结果是157505658604,这个值显然不对,但是有点儿接近正确值,不知道该如何解决

user1988539:

原因找到了,出现的异常现象是因为积的低32位被乘以2了,高32位没有变。试了一下两个比较小的数相乘,乘积不超过32位的时候积是理论值的2倍。

根本原因怀疑是引用的别人的汇编库运行中修改了PM位的值,因为以前遇到过类似的情况,但是都是32位的数,也没有从根本上解决。

我想问一下如果全部用TI的库,比如DSP库,会不会也有类似的情况出现。打算参考TI的定点DSP库修改程序,但是怕也有类似的情况出现,希望能给个建议

使用的CCS3.3,芯片是2812,做两个32位数的乘法,结果总是不正确,可以确定不是因为溢出产生的错误。有没有人遇到过类似的情况。

关键部分代码如下:

long long a;

long long b;

long long C;

a = (int64)U;
b= (int64)I;
C = a * b;

U和I是型参,32位无符号整数。测试中U=229777,I =679190,用window的计算机算的值是156062240630,这个值应该是对的。乘数其中一个是10 的整数倍,积应该也是的。而上述代码算出来的结果是157505658604,这个值显然不对,但是有点儿接近正确值,不知道该如何解决

mangui zhang:

回复 user1988539:

先看看2812的数据类型吧 

使用的CCS3.3,芯片是2812,做两个32位数的乘法,结果总是不正确,可以确定不是因为溢出产生的错误。有没有人遇到过类似的情况。

关键部分代码如下:

long long a;

long long b;

long long C;

a = (int64)U;
b= (int64)I;
C = a * b;

U和I是型参,32位无符号整数。测试中U=229777,I =679190,用window的计算机算的值是156062240630,这个值应该是对的。乘数其中一个是10 的整数倍,积应该也是的。而上述代码算出来的结果是157505658604,这个值显然不对,但是有点儿接近正确值,不知道该如何解决

user1988539:

回复 mangui zhang:

问题的根本原因不是数据类型的问题,简单的数据类型的问题很明显的。
现在基本可以确定问题的根本原因就在与所用的汇编库里面操作了PM位。导致用C写的函数做乘法时受到了PM位的影响。

我想确定一下如果没有额外的操作,是不是能保证数据计算的正确性。还有如果是32位的乘法,在CCS里面用C直接写和汇编效率上能差多少?

赞(0)
未经允许不得转载:TI中文支持网 » C2000两个32位数的乘法问题
分享到: 更多 (0)