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

2009-3-30 10:12 11254 9 9 分类: MCU/ 嵌入式
以下两种方法仅提供思考方向,未进行实际测试。

第一种方法:
#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;
}
第二种方法:
#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);
  }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条