打印

C51编程:keil中怎么取浮点数得整数和小数部分

[复制链接]
12284|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alangfth|  楼主 | 2007-4-12 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<math.h>
#include<absacc.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
main( )
{
float  i;
uint   j;
float  k;
uint   k1;

i=100.789;

j=i;
k=i-j;
k1=(k*10)/10;

printf("j=%d ",j);
printf("k1=%d ",k1);
}
在哪里查看j和k1的值,就是浮点数的整数和小数部分,上面的方法对嘛?
小弟不才 ,高手指教!

相关帖子

沙发
djc001| | 2007-4-12 16:07 | 只看该作者

sprintf比较适合,代码很大.

使用特权

评论回复
板凳
alangfth|  楼主 | 2007-4-12 16:15 | 只看该作者

回复

djc001 

2楼: sprintf比较适合,代码很大.

请问我上面的算法对嘛?

我自己的思路就是如何把一个转化得到的浮点数用数码管显示出来?

使用特权

评论回复
地板
alangfth|  楼主 | 2007-4-12 16:20 | 只看该作者

郁闷啊

使用特权

评论回复
5
zxq1234508| | 2007-4-12 16:37 | 只看该作者

应该这样吧

k1=(k*10)/10;这有问题哦。应该是k1=(k*10)/1;但这也只能取一位小数。就看你要精确到小数点后多少位了。

使用特权

评论回复
6
alangfth|  楼主 | 2007-4-12 18:28 | 只看该作者

回复

zxq1234508 发表于 2007-4-12 16:37 侃单片机 ←返回版面    

5楼: 应该这样吧 

k1=(k*10)/10;这有问题哦。应该是k1=(k*10)/1;但这也只能取一位小数。就看你要精确到小数点后多少位了。

我想取到小数点后面的两位
谢谢 
怎么做
大侠们指点一下啊
 
 

使用特权

评论回复
7
燕南啸| | 2007-4-12 18:50 | 只看该作者

看看

C51有专门的库文件MATH.H,  里面有个函数
它是这样定义的extern float modf(float x, float *ip);
调用它之后,整数部分被放入*ip, 小数部分作为返回值。

使用特权

评论回复
8
567| | 2007-4-12 19:35 | 只看该作者

我认为

把这个浮点数直接赋给一个整型数,就得到了它的整数部分。

这个浮点数减掉它的整数部分,就得到它的小数部分,
如果要把小数部分转换为整数,取小数点后两位,则小数部分*100,再赋给一个整型数。

使用特权

评论回复
9
王紫豪| | 2007-4-12 22:26 | 只看该作者

最好用math库

使用特权

评论回复
10
o_dan| | 2007-4-13 08:45 | 只看该作者

对用math.h我强烈支持!!!

   因为这类库函数相当可靠!它们都是经过实践来证明了的!!!
   虽然自己写的也没错,但是没经过时间的验证哈!我推荐能用库函数就用库,那样省时又省力!!!呵呵

使用特权

评论回复
11
alangfth|  楼主 | 2007-4-13 09:22 | 只看该作者

大家看看

 谢谢 大家,是不是应该是这样啊 
#include<reg51.h>
#include<math.h>
#include<absacc.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
extern float modf(float x, float *ip)
main( )
{
float  i;
float  *n;
float  k;
uint   k1;

i=100.789;

k=modf(100.789,n); //这句写成k=modf(100.789) 对吗?
k1=*n;
}


执行完上面的程序之后,k=0.789;k1=100  还是直接取出里面的数字k=789;k1=100  有什么不对,请赐教

使用特权

评论回复
12
xzhenggen| | 2007-4-13 12:16 | 只看该作者

寻找电脑圈圈帮忙啊!!!

使用串行12位ADC芯片采集信号(光信号),如何使用读取ADC的变量值,在LCD上显示出它的功率大小。功率的单位有dbm,mw,uw,nw.及DB,特别是小数部分的显示是如何整出来的?比如我的功率是4.096W,或36.3dbm,或0.0098 nw像这样的数据在LCD上是如何显示出来的?因为是串行12位ADC,所以有可能高4位是整数部分,低8位是小数部分.或者高8位是整数部分,低4位是小数部分,这种情况如何判断?

使用特权

评论回复
13
alangfth|  楼主 | 2007-4-13 18:24 | 只看该作者

大家进来看看啊

使用特权

评论回复
14
zgl7903| | 2007-4-13 20:16 | 只看该作者

试一试这个

#include <limits.h>
#define PRECISION 4 //精度 

char float_format(double db_data,long *part_a,long*part_b)
{
  double double_data = db_data;//临时变量 
  if(double_data > LONG_MAX) //上溢 
    return(1);
  if(double_data < LONG_MIN) //下溢     
    return(-1);
        
  if(db_data<0)//取绝对值  
    double_data =-db_data;  

  //4舍5入  
 #if PRECISION==1 //1位精度 
  double_data += 0.05;     
 #elif PRECISION==2  //2位精度 
  double_data += 0.005;
 #elif PRECISION==3  //3位精度 
  double_data += 0.0005;
 #elif PRECISION==4//4位精度 
  double_data += 0.00005;
 #else //可以顺延增加精度位数 
  #error The precision bit overflower
 #endif

  *part_a = (long)double_data; //整数部分     
  double_data -= *part_a;//小数部分  
  if(db_data < 0)    //整数部分恢复原始正负符号   
    *part_a = - *part_a;

  //小数部分取整 
 #if PRECISION==1 //1位精度 
  double_data *= 10;
 #elif PRECISION==2  //2位精度 
  double_data *= 100;
 #elif PRECISION==3  //3位精度 
  double_data *= 1000;
 #elif PRECISION==4//4位精度 
  double_data *= 10000;     
 #else //可以顺延增加精度位数 
  #error The precision bit overflower  
 #endif

  *part_b = (long)double_data; //取小数部分   

  return(0);
}

//一下为测试程序
#include <stdlib.h>
void test()
{
  long part_a,part_b;
  double input;

  while(1)
  {
    //随机数生成 输入数据
    input = rand();
    input *= rand();
    input /= rand();
    if(rand()%2==0)
      input = -input;
    float_format(input,&part_a,&part_b);
  }
}

使用特权

评论回复
15
alangfth|  楼主 | 2007-4-14 12:18 | 只看该作者

谢谢大家

使用特权

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

本版积分规则

2

主题

10

帖子

0

粉丝