stirwl 发表于 2013-7-25 15:31:02

有没有支持64位乘法运算的开发环境?

本帖最后由 stirwl 于 2013-7-25 18:48 编辑

最经要算个大数,keilc只支持到32位,自己写64位乘法又出各种问题啊
我想找个能做32位乘法的就行了,最大能乘出64位。自己写了个程序,运行结果很奇怪啊
void main(void)
{
      unsigned long a=188,b=24910,c=188,d=24910;
      unsigned long x=1,y=1,z=1,w=1;
      unsigned long q1=1,q2=2,q3=3,q4=4;
      x=a*d;
      y=b*d;
      z=a*c;
      w=b*c;
      q4=y&0x0000ffff;
      q3=(q4>>16)+x+w;
      q2=(q3>>16)+z;
      q1=(q2>>16);
}

乘出来以后应该是q1-q4的4个低16位是所求的64位结果的,结果仿真的时候好多变量不知道怎么回事都跟着其他变量变

修改了一下公式,可以避免大整数计算了

qlb1234 发表于 2013-7-25 15:35:20

看編譯器吧。
1箇64位數乘以另一箇64位數,得數最大可以是128位數。
呵呵,有沒有支持unsigned long long long int的編譯器?

stirwl 发表于 2013-7-25 15:43:58

qlb1234 发表于 2013-7-25 15:35 static/image/common/back.gif
看編譯器吧。
1箇64位數乘以另一箇64位數,得數最大可以是128位數。
呵呵,有沒有支持unsigned long long l ...

我想找个能做32位乘法的就行了,最大能乘出64位。自己写了个程序,运行结果很奇怪啊
void main(void)
{
        unsigned long a=188,b=24910,c=188,d=24910;
        unsigned long x=1,y=1,z=1,w=1;
        unsigned long q1=1,q2=2,q3=3,q4=4;
        x=a*d;
        y=b*d;
        z=a*c;
        w=b*c;
        q4=y&0x0000ffff;
        q3=(q4>>16)+x+w;
        q2=(q3>>16)+z;
        q1=(q2>>16);
}

乘出来以后应该是q1-q4的4个低16位是所求的64位结果的,结果仿真的时候好多变量不知道怎么回事都跟着其他变量变

yongjia 发表于 2013-7-25 15:47:27

需要这么大精度的数据,还不如直接上ARM 好了,M3,M4大把的芯片,一下就可以解决了你的问题。{:handshake:}

lee_avr 发表于 2013-7-25 15:49:27

用那么费劲么?用char a x char b
一位一位按照乘法规则用字符乘出来就ok了得到的结果也是字符数组

stirwl 发表于 2013-7-25 15:52:59

yongjia 发表于 2013-7-25 15:47 static/image/common/back.gif
需要这么大精度的数据,还不如直接上ARM 好了,M3,M4大把的芯片,一下就可以解决了你的问题。{:handshake: ...

ARM贵啊,用51便宜,而且个头小

stirwl 发表于 2013-7-25 15:53:37

lee_avr 发表于 2013-7-25 15:49 static/image/common/back.gif
用那么费劲么?用char a x char b
一位一位按照乘法规则用字符乘出来就ok了得到的结果也是字 ...

好想法!
虽然浪费了一些空间,但计算简单了不少,不用想破脑袋了{:mad:}

i55x 发表于 2013-7-25 16:05:26

试试IAR8051

stirwl 发表于 2013-7-25 16:11:45

i55x 发表于 2013-7-25 16:05 static/image/common/back.gif
试试IAR8051


iar8051很奇怪,long 和long long 竟然都是32位的

i55x 发表于 2013-7-25 16:14:20

很久很久以前用过IAR8051,似乎还有一个DLIB里面的类型比较长。

wajlh 发表于 2013-7-25 16:19:52

论坛里有算法啊

stirwl 发表于 2013-7-25 16:22:31

i55x 发表于 2013-7-25 16:14 static/image/common/back.gif
很久很久以前用过IAR8051,似乎还有一个DLIB里面的类型比较长。

刚去看了一下,估计Dlib也不支持64位运算……

xf331785508 发表于 2013-7-25 16:50:14

__int64 Calculat(unsigned long int a,unsigned long int b)
{
        unsigned long int i = 0;
        __int64 result = 0;
        for(i = 0; i < a;i++)
        {
                result += b;
        }
        return result;
}

看了一下结果对比,高32位丢失了。t = Calculat(0x1234567812345678,0x1111111122222222);
        printf("%x,%d \r\n",t,t);

i55x 发表于 2013-7-25 16:52:39

楼上看不懂撸主要用8051的编译器就别出来丢人现眼了。

stirwl 发表于 2013-7-25 16:55:30

伤不起啊,既回复不了也发不了短消息……

wajlh 发表于 2013-7-25 16:19 static/image/common/back.gif
论坛里有算法啊

在哪啊?
我搜了一下没搜出来哎,
是单片机上的算法吗?
(PS.每小时只能回复5个,也发不了短消息,只能过1个小时再发了)

stirwl 发表于 2013-7-25 17:00:07

xf331785508 发表于 2013-7-25 16:50 static/image/common/back.gif
看了一下结果对比,高32位丢失了。

估计累加的时候编译器把数据都转换成long型的了吧,一般的编译器都会这么干

xf331785508 发表于 2013-7-25 17:17:30

i55x 发表于 2013-7-25 16:52 static/image/common/back.gif
楼上看不懂撸主要用8051的编译器就别出来丢人现眼了。

别动不动就人身攻击!素质!!!!

信天游 发表于 2013-7-25 18:06:49

转换成浮点型如何?哪位大神科普一下

stirwl 发表于 2013-7-25 18:11:20

有没有支持64位乘法运算的开发环境?

信天游 发表于 2013-7-25 18:06 static/image/common/back.gif
转换成浮点型如何?哪位大神科普一下

转换成浮点数是可以处理更大的数了,但是会丢失数据呢

BXAK 发表于 2013-7-25 23:17:51

算法不少,网上有的,自己搜搜“c51 多字节乘法”
比如 匠人那个移位法

stirwl 发表于 2013-7-25 23:24:21

BXAK 发表于 2013-7-25 23:17 static/image/common/back.gif
算法不少,网上有的,自己搜搜“c51 多字节乘法”
比如 匠人那个移位法

恩,好多都是用汇编的,
其实我觉得上面我写的那段程序也应该能算的出来,但不知道为什么计算的时候对一个变量赋值其他的也会跟着变

mbass51 发表于 2013-7-26 11:25:15

如何可求出呢?教一教?

yongjia 发表于 2013-7-26 11:35:45

stirwl 发表于 2013-7-25 15:52 static/image/common/back.gif
ARM贵啊,用51便宜,而且个头小

STM32F103CBXX之类的,封装很小的,资源足够你用了

stirwl 发表于 2013-7-26 22:07:45

yongjia 发表于 2013-7-26 11:35 static/image/common/back.gif
STM32F103CBXX之类的,封装很小的,资源足够你用了

用的资源倒不是很多,关键要计算32位乘法,那应该支持到64位乘法运算才行啊

stirwl 发表于 2013-7-26 22:08:42

mbass51 发表于 2013-7-26 11:25 static/image/common/back.gif
如何可求出呢?教一教?

上面的代码就能求出来,不过在vc下运行没问题,在keil下就有问题了,还没找到原因呢

fastweb 发表于 2013-7-27 10:01:54

因为Keil C51本身并不支持Int64,long long之类的数据类型。
只能完全自己用函数写。比如用字数组或长字数组,用字符数组也可以。

stirwl 发表于 2013-7-27 12:41:55

fastweb 发表于 2013-7-27 10:01 static/image/common/back.gif
因为Keil C51本身并不支持Int64,long long之类的数据类型。
只能完全自己用函数写。比如用字数组或长字数 ...

写了一段,就最上面那段,但是在vc里运行没问题,在keil下仿真就有问题了

xyz543 发表于 2013-7-27 13:39:55

楼主请参考这帖-> 8位单片机,大数运算,可以运算任意位数的乘除法看看能否有些帮助 ... {:smile:}

stirwl 发表于 2013-7-27 14:12:07

xyz543 发表于 2013-7-27 13:39 static/image/common/back.gif
楼主请参考这帖-> 8位单片机,大数运算,可以运算任意位数的乘除法看看能否有些帮助 ......

刚看了下,就是这个东西,
3Q very much!

xyz543 发表于 2013-7-27 15:21:38

stirwl 发表于 2013-7-27 14:12 static/image/common/back.gif
刚看了下,就是这个东西,
3Q very much!

不客气,您合用就好 ... {:smile:}

yongjia 发表于 2013-7-29 10:16:30

stirwl 发表于 2013-7-26 22:07 static/image/common/back.gif
用的资源倒不是很多,关键要计算32位乘法,那应该支持到64位乘法运算才行啊 ...

要支持64位乘法,低档的MCU你需要自己处理,找找汇编的也许比较方便,如果是ARM的,32位乘法就方便了

kevinchen026 发表于 2013-7-29 10:50:33

看帖积极回帖,增加莫元

kevinchen026 发表于 2013-7-29 10:51:52

看帖积极回帖,增加莫元

356053261 发表于 2013-7-29 18:35:07

记号一下,万能的神坛,总会找到解决问题的方法

stirwl 发表于 2013-7-30 09:58:30

yongjia 发表于 2013-7-29 10:16 static/image/common/back.gif
要支持64位乘法,低档的MCU你需要自己处理,找找汇编的也许比较方便,如果是ARM的,32位乘法就方便了 ...

恩,主要是处理算法在vc上运行没问题,在keil上仿真就有问题了

stirwl 发表于 2013-7-30 09:59:21

xyz543 发表于 2013-7-27 15:21 static/image/common/back.gif
不客气,您合用就好 ...

最后还是偷了一下懒,先算除法再算乘法就不用计算大数了{:lol:}

xyz543 发表于 2013-7-30 10:04:01

stirwl 发表于 2013-7-30 09:59 static/image/common/back.gif
最后还是偷了一下懒,先算除法再算乘法就不用计算大数了

这是当然的,您的需求不是要显示这么多位数的话,就您说的这做法就行了 ... {:smile:}

yongjia 发表于 2013-7-30 14:15:50

能够解决问题就可以了,现在估计楼主已经搞定这个问题了吧
页: [1]
查看完整版本: 有没有支持64位乘法运算的开发环境?