打印

如果我的浮点数是个不确定的数??

[复制链接]
2541|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzhenggen|  楼主 | 2007-4-25 09:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如:float x=14.57;也许可能是float x=145.7;像这样的数据在LCD屏上如何准确地显示出来.也就是如何准确地判断小数位??
使用环境,
测量信号,计算得到一个浮点数,范围在1.457到24.4之间,在单片机中自然是二进制存放的,但是显示的时候肯定要转成十进制,于是碰到了这个算法的问题,不知道如何解决。
变量值的小数如何准确定位啊?!

相关帖子

沙发
lixun00| | 2007-4-25 09:48 | 只看该作者

可用sprintf函数,但浮点数得到的小数位一般是7位(记不太清

使用特权

评论回复
板凳
xzhenggen|  楼主 | 2007-4-25 09:49 | 只看该作者

我需要的是在LCD上准确地显示出带小数位的数值。

使用特权

评论回复
地板
sharks| | 2007-4-25 10:43 | 只看该作者

if

  if (x<10)
     {
     }
  else
     {
      }

使用特权

评论回复
5
xwj| | 2007-4-25 11:49 | 只看该作者

你先去搜索IEEE 浮点数格式,看了就明白了

不要什么都不做就只会瞎问哦
有这功夫的话 早就自己找到答案了

使用特权

评论回复
6
xzhenggen|  楼主 | 2007-4-25 12:01 | 只看该作者

XWJ大师,能否指点一二啊!多谢了.

使用特权

评论回复
7
xwj| | 2007-4-25 12:14 | 只看该作者

告诉你方法了,你自己却什么都不做光瞎问???

使用特权

评论回复
8
mxh0506| | 2007-4-25 12:26 | 只看该作者

如果你还在用汇编的话,没办法,自己写程序转

如果用C,很简单,就像2楼说的调sprintf()就可以了.需要的小数位数可以在格式串里指定,去查函数库参考吧

使用特权

评论回复
9
xzhenggen|  楼主 | 2007-4-25 12:41 | 只看该作者

我用的是串行12位ADC采集的二进制数值,小数位保留3位。

IEEE浮点数的存放格式 
对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数), 
1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示; 
2、第30~23 bit为幂数,其读数值用e表示; 
3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x; 

则按照规定,该浮点数的值用十进制表示为: 
= (-1)^s  * (1 + x) * 2^(e - 127) 

对于49E48E68来说, 
1、其第31 bit为0,即s = 0 
2、第30~23 bit依次为100 1001 1,读成十进制就是147,即e = 147。 
3、第22~0 bit依次为110 0100 1000 1110 0110 1000,也就是二进制的纯小数0.110 0100 1000 1110 0110 1000,其十进制形式为0.78559589385986328125,即x = 0.78559589385986328125。 

这样,该浮点数的十进制表示 
= (-1)^s  * (1 + x) * 2^(e - 127) 
= (-1)^0  * (1+ 0.78559589385986328125) * 2^(147-127) 
= 1872333 

你可以用windows自带的计算器算一下。 
我看了上面的例程没有多大用处。

使用特权

评论回复
10
xwj| | 2007-4-25 12:47 | 只看该作者

晕~~~你那个和浮点数没一点关系

ADC输出都是定点的,你只要自己换算下就可以了

不要立马就问怎么做哦,
这是最基本的技能,如果你这都不会或想不通,那么建议你尽早转行

使用特权

评论回复
11
xzhenggen|  楼主 | 2007-4-25 17:30 | 只看该作者

老大:不要开口闭口就叫别人转行,我能转早就转了。

我不懂才向你请教,即然你说得有理,干吗不肯帮我写一个例程?
void   calc(unsigned   char   p)   
  {   
  float   tt;   
  unsigned   int   cc;   
  tt=p*19.604;//[t];   
  adcv[0]=tt/1000;   
  adcv[1]=(tt-adcv[0]*1000)/100;   
  adcv[2]=(tt-adcv[0]*1000-adcv[1]*100)/10;   
  adcv[3]=(int)tt%10;   
  cc=adcv[0]*1000+adcv[1]*100+adcv[2]*10+adcv[3];   
  adcv[4]=(tt-cc)*10;   
  adcv[5]=((tt-cc)*10-adcv[4])*10;   
  }   
我是问如何定位小数位?及如何算整数及小数。

使用特权

评论回复
12
王紫豪| | 2007-4-25 18:28 | 只看该作者

典型的简单问题复杂化,楼主可能不喜欢听,呵呵!不要生

使用特权

评论回复
13
sharks| | 2007-12-8 19:02 | 只看该作者

唉...我来当好人吧。


第一步,编写定点数显示函数DisplayNumber(int Number, char DOT)
两个参数分别是定点数,小数点位数。

这个函数先拆分Number,变成10进制数。二进制/十进制转换中学数学里就有, 不会忘了吧?想不起来了就参考下面的思路:
 unsigned char Buff[5]

 Buff[0]=Number%10;Number/=10;
 Buff[1]=Number%10;Number/=10;
 Buff[2]=Number%10;Number/=10;
 Buff[3]=Number%10;Number/=10;
 Buff[4]=Number%10;Number/=10;
 想要代码少,就改用for循环做

 然后一个for()将DOT后数字打出来,另一个for循环将DOT前数字打出来。最后将小数点打出来。

   这样,DisplayNumber(12345, 2) 打印出 123.45 
         DisplayNumber(12345, 3) 打印出 12.345 
 

然后编写孚点显示函数DisplayFloat(float FNumber)
思路是先判断数据多少位,然后调用不同的定点显示函数

if     (FNumber>1000) DisplayNumber(FNumber,0)
else if(FNumber>100)  DisplayNumber(FNumber*10,1)
else if(FNumber>10)  DisplayNumber(FNumber*100,2)
else if(FNumber>1)  DisplayNumber(FNumber*1000,3)


  思路仅供参考,LZ如果不思程序的考结构和思路,很难成长。

使用特权

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

本版积分规则

55

主题

529

帖子

1

粉丝