打印

打算用51单片机做个简单计算器

[复制链接]
4430|23
手机看帖
扫描二维码
随时随地手机跟帖
沙发
alice84| | 2008-1-21 17:28 | 只看该作者

地板

使用特权

评论回复
板凳
maychang| | 2008-1-21 17:33 | 只看该作者

51单片机在处理浮点数方面的能力与所有单片机一样,靠软件实现。不过对手动输入的计算器来说,足够。

使用特权

评论回复
地板
alice84| | 2008-1-22 14:13 | 只看该作者

maychang大叔这个问题就说到这里了?

不说一下浮点数方面的编程问题吗?

使用特权

评论回复
5
zlgmcuCHTZ| | 2008-1-22 15:29 | 只看该作者

到网上找了,有浮点数运算的软件包

使用特权

评论回复
6
zlgmcuCHTZ| | 2008-1-22 15:30 | 只看该作者

建议自己写个先。

使用特权

评论回复
7
alice84| | 2008-1-22 15:30 | 只看该作者

什么语言的.

使用特权

评论回复
8
alice84| | 2008-1-22 15:37 | 只看该作者

想不出来

有小数部分和没有小数部分的.得把整数和小数部分转成2进制的吧.然后还要移小数点到最高位,然后还要进行127+移动的位数的值转为2进制放中间.还有符号位,这样就有三部分了.然后表示成16进制.

使用特权

评论回复
9
maychang| | 2008-1-22 17:06 | 只看该作者

要是用C语言,根本不必考虑浮点计算不浮点计算

用汇编语言那就要考虑了,浮点数麻烦得多。

使用特权

评论回复
10
alice84| | 2008-1-22 17:08 | 只看该作者

定义float

使用特权

评论回复
11
sz_kd| | 2008-1-22 17:12 | 只看该作者

浮点数转换成整数来运算

使用特权

评论回复
12
alice84| | 2008-1-22 17:14 | 只看该作者

(int)

使用特权

评论回复
13
sz_kd| | 2008-1-22 17:16 | 只看该作者

我说汇编里的,C里还要你考虑这么多干什么

使用特权

评论回复
14
sz_kd| | 2008-1-22 17:17 | 只看该作者

就简单的加减乘除这样已经足够

使用特权

评论回复
15
alice84| | 2008-1-22 17:22 | 只看该作者

????????

void   DecodeFloat(   BYTE   pByte[4]   ) 

  printf(   "原始(十进制):%d     %d     %d     %d  "   ,   (int)pByte[0], 
    (int)pByte[1],   (int)pByte[2],   (int)pByte[3]   ); 
  printf(   "翻转(十进制):%d     %d     %d     %d  "   ,   (int)pByte[3], 
    (int)pByte[2],   (int)pByte[1],   (int)pByte[0]   ); 
  bitset <32>   bitAll(   *(ULONG*)pByte   ); 
  string   strBinary   =   bitAll.to_string <char,   char_traits <char> ,   allocator <char>   > (); 
  strBinary.insert(   9,   "     "   ); 
  strBinary.insert(   1,   "     "   ); 
  cout   < <   "二进制: "   < <   strBinary.c_str()   < <   endl; 
  cout   < <   "符号: "   < <   (   bitAll[31]   ?   "- "   :   "+ "   )   < <   endl; 
  bitset <32>   bitTemp; 
  bitTemp   =   bitAll; 
  bitTemp   < <=   1; 
  LONG   ulExponent   =   0; 
  for   (   int   i   =   0;   i   <   8;   i++   ) 
  { 
    ulExponent   ¦=   (   bitTemp[   31   -   i   ]   < <   (   7   -   i   )   ); 
  } 
  ulExponent   -=   127; 
  cout   < <   "指数(十进制): "   < <   ulExponent   < <   endl; 
  bitTemp   =   bitAll; 
  bitTemp   < <=   9; 
  float   fMantissa   =   1.0f; 
  for   (   int   i   =   0;   i   <   23;   i++   ) 
  { 
    bool   b   =   bitTemp[   31   -   i   ]; 
    fMantissa   +=   (   (float)bitTemp[   31   -   i   ]   /   (float)(   2   < <   i   )   ); 
  } 
  cout   < <   "尾数(十进制): "     < <   fMantissa   < <   endl; 
  float   fPow; 
  if   (   ulExponent   > =   0   ) 
  { 
    fPow   =   (float)(   2   < <   (   ulExponent   -   1   )   ); 
  } 
  else 
  { 
    fPow   =   1.0f   /   (float)(   2   < <   (   -1   -   ulExponent   )   ); 
  } 
  cout   < <   "运算结果: "   < <   fMantissa   *   fPow   < <   endl; 

使用特权

评论回复
16
sz_kd| | 2008-1-22 17:24 | 只看该作者

有指数运算的浮点数才复杂啊

使用特权

评论回复
17
linqing171| | 2008-1-22 17:35 | 只看该作者

不容易。

以前调试过8K的汇编浮点库,也是51的。指数sin都有。
网上有下的,不过要注意一些错误,特别是除以0的。要是用C就简单多了。
写的时候不能按照常规出牌,比如正弦是查表+插值的,有些除法是用减法做的。还要考虑浮点数的归一化,还要有除以0错误的避免,不然你做FFT出现莫名的数据错误去查吧。

使用特权

评论回复
18
linqing171| | 2008-1-22 17:39 | 只看该作者

浮点的指数运算不是很复杂吧?

数字部分相乘,后面的相加,调整小数点的位置,特殊浮点数转化(比如是否为0),就差不多了吧。用C语言做好一些。

使用特权

评论回复
19
sz_kd| | 2008-1-22 17:49 | 只看该作者

比如2.3^1.22就麻烦

还是用C来

使用特权

评论回复
20
郁闷中|  楼主 | 2008-1-22 18:02 | 只看该作者

到网上找了一些资料,感觉写起程序来不容易。

又是补码又是移码的,头都大了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

11

帖子

1

粉丝