原创
C51编程:keil中怎么取浮点数得整数和小数部分
以下两种方法仅提供思考方向,未进行实际测试。
第一种方法:
#include<reg51.h>
#include<math.h>
#include<absacc.h>
#include<stdio.h>
#define uint unsigned int
#define u
CHAR unsigned
CHARextern 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);
}
}
文章评论(0条评论)
登录后参与讨论