导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请朋友们帮忙:在MCU内如何实现操作数大于2^32(4294[yzzhangliyang]

 *第37373篇: 请朋友们帮忙:在MCU内如何实现操作数大于2^32(4294967296)的计算?

  
楼 主:yzzhangliyang 2006年1月24日10:17
 请朋友们帮忙:在MCU内如何实现操作数大于2^32(4294967296)的计算?
本人做设备时用AD9850产生连续变化的频率信号(200Hz~1700000Hz),精度是1Hz,需要适时计算AD9850的32位频率控制数据,计算式:2^32*freq/Cref
其中:2^32=4294967296
         freq是要输出的频率值(200Hz~1700000Hz)
         Cref是参考时钟,选用16M(16000000Hz)
请朋友们出出主意,谢谢!
  
2楼:stan1998 2006年1月25日14:50
 如下
可以用2^32/Cref*freq,不过2^32本身已经超出了unsigned long(0~4294967295)的范围。
可以用2^31/(Cref/2)*freq,如果嫌精度不过,就在这些变量前加个double。
  
3楼:戈卫东 2006年1月27日02:00
 要用汇编语言
在汇编语言里面是没有32bit的限制的

你的应用是较特殊的,不可以先算除法,那会损失精度。

  
4楼:戈卫东 2006年1月27日02:09
 另一办法,是选特殊的参考频率
当2^32/Cref正好可整除时,就可以存储一个常数,这个除法就不需要计算了。

比如选用16777216的Cref,2^32/Cref=256,你需要的数就是 freq*256, freq  <  <8,又快又好。

  
5楼:戈卫东 2006年1月27日22:38
 还有一办法,更通用些
因为Cref是常数,16000000, 2^32/Cref=268, 余数是6967296,你需要的累加常数 =freq*268+freq*6967296/Cref
  
6楼:戈卫东 2006年2月9日15:57
 唉呀...有bug
freq*6967296 还是会超过32bit

看来可用的办法有3个,一是用汇编语言,一是用特殊的Cref,一是用双精度浮点数。

在MCU上实现双精度浮点数的成本是很高的。


>>>>>>对该主题发表你的看法

本主题贴数6,分页: [第1页]


[上一篇主题]:ARM 开发手持式的 该如何选型 ??

[下一篇主题]:关于8051与ADC0809的汇编问题!!