有没有支持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位结果的,结果仿真的时候好多变量不知道怎么回事都跟着其他变量变
修改了一下公式,可以避免大整数计算了 看編譯器吧。
1箇64位數乘以另一箇64位數,得數最大可以是128位數。
呵呵,有沒有支持unsigned long long long int的編譯器? 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位结果的,结果仿真的时候好多变量不知道怎么回事都跟着其他变量变 需要这么大精度的数据,还不如直接上ARM 好了,M3,M4大把的芯片,一下就可以解决了你的问题。{:handshake:} 用那么费劲么?用char a x char b
一位一位按照乘法规则用字符乘出来就ok了得到的结果也是字符数组 yongjia 发表于 2013-7-25 15:47 static/image/common/back.gif
需要这么大精度的数据,还不如直接上ARM 好了,M3,M4大把的芯片,一下就可以解决了你的问题。{:handshake: ...
ARM贵啊,用51便宜,而且个头小 lee_avr 发表于 2013-7-25 15:49 static/image/common/back.gif
用那么费劲么?用char a x char b
一位一位按照乘法规则用字符乘出来就ok了得到的结果也是字 ...
好想法!
虽然浪费了一些空间,但计算简单了不少,不用想破脑袋了{:mad:} 试试IAR8051 i55x 发表于 2013-7-25 16:05 static/image/common/back.gif
试试IAR8051
iar8051很奇怪,long 和long long 竟然都是32位的 很久很久以前用过IAR8051,似乎还有一个DLIB里面的类型比较长。 论坛里有算法啊 i55x 发表于 2013-7-25 16:14 static/image/common/back.gif
很久很久以前用过IAR8051,似乎还有一个DLIB里面的类型比较长。
刚去看了一下,估计Dlib也不支持64位运算…… __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); 楼上看不懂撸主要用8051的编译器就别出来丢人现眼了。
伤不起啊,既回复不了也发不了短消息……
wajlh 发表于 2013-7-25 16:19 static/image/common/back.gif论坛里有算法啊
在哪啊?
我搜了一下没搜出来哎,
是单片机上的算法吗?
(PS.每小时只能回复5个,也发不了短消息,只能过1个小时再发了) xf331785508 发表于 2013-7-25 16:50 static/image/common/back.gif
看了一下结果对比,高32位丢失了。
估计累加的时候编译器把数据都转换成long型的了吧,一般的编译器都会这么干 i55x 发表于 2013-7-25 16:52 static/image/common/back.gif
楼上看不懂撸主要用8051的编译器就别出来丢人现眼了。
别动不动就人身攻击!素质!!!! 转换成浮点型如何?哪位大神科普一下
有没有支持64位乘法运算的开发环境?
信天游 发表于 2013-7-25 18:06 static/image/common/back.gif转换成浮点型如何?哪位大神科普一下
转换成浮点数是可以处理更大的数了,但是会丢失数据呢 算法不少,网上有的,自己搜搜“c51 多字节乘法”
比如 匠人那个移位法 BXAK 发表于 2013-7-25 23:17 static/image/common/back.gif
算法不少,网上有的,自己搜搜“c51 多字节乘法”
比如 匠人那个移位法
恩,好多都是用汇编的,
其实我觉得上面我写的那段程序也应该能算的出来,但不知道为什么计算的时候对一个变量赋值其他的也会跟着变 如何可求出呢?教一教? stirwl 发表于 2013-7-25 15:52 static/image/common/back.gif
ARM贵啊,用51便宜,而且个头小
STM32F103CBXX之类的,封装很小的,资源足够你用了 yongjia 发表于 2013-7-26 11:35 static/image/common/back.gif
STM32F103CBXX之类的,封装很小的,资源足够你用了
用的资源倒不是很多,关键要计算32位乘法,那应该支持到64位乘法运算才行啊 mbass51 发表于 2013-7-26 11:25 static/image/common/back.gif
如何可求出呢?教一教?
上面的代码就能求出来,不过在vc下运行没问题,在keil下就有问题了,还没找到原因呢 因为Keil C51本身并不支持Int64,long long之类的数据类型。
只能完全自己用函数写。比如用字数组或长字数组,用字符数组也可以。 fastweb 发表于 2013-7-27 10:01 static/image/common/back.gif
因为Keil C51本身并不支持Int64,long long之类的数据类型。
只能完全自己用函数写。比如用字数组或长字数 ...
写了一段,就最上面那段,但是在vc里运行没问题,在keil下仿真就有问题了 楼主请参考这帖-> 8位单片机,大数运算,可以运算任意位数的乘除法看看能否有些帮助 ... {:smile:} xyz543 发表于 2013-7-27 13:39 static/image/common/back.gif
楼主请参考这帖-> 8位单片机,大数运算,可以运算任意位数的乘除法看看能否有些帮助 ......
刚看了下,就是这个东西,
3Q very much! stirwl 发表于 2013-7-27 14:12 static/image/common/back.gif
刚看了下,就是这个东西,
3Q very much!
不客气,您合用就好 ... {:smile:} stirwl 发表于 2013-7-26 22:07 static/image/common/back.gif
用的资源倒不是很多,关键要计算32位乘法,那应该支持到64位乘法运算才行啊 ...
要支持64位乘法,低档的MCU你需要自己处理,找找汇编的也许比较方便,如果是ARM的,32位乘法就方便了 看帖积极回帖,增加莫元 看帖积极回帖,增加莫元 记号一下,万能的神坛,总会找到解决问题的方法 yongjia 发表于 2013-7-29 10:16 static/image/common/back.gif
要支持64位乘法,低档的MCU你需要自己处理,找找汇编的也许比较方便,如果是ARM的,32位乘法就方便了 ...
恩,主要是处理算法在vc上运行没问题,在keil上仿真就有问题了 xyz543 发表于 2013-7-27 15:21 static/image/common/back.gif
不客气,您合用就好 ...
最后还是偷了一下懒,先算除法再算乘法就不用计算大数了{:lol:} stirwl 发表于 2013-7-30 09:59 static/image/common/back.gif
最后还是偷了一下懒,先算除法再算乘法就不用计算大数了
这是当然的,您的需求不是要显示这么多位数的话,就您说的这做法就行了 ... {:smile:} 能够解决问题就可以了,现在估计楼主已经搞定这个问题了吧
页:
[1]