C51单片机浮点数运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C51单片机浮点数运算相关的知识,希望对你有一定的参考价值。

两个计数器得来的数值a,b
想将两个数做一个除法运算,浮点数保留三位,然后数码管输出显示
请问具体思路和需要注意哪些方面,能附上程序,将万分感激!!

因为没有电路,所以程序我就没法给你写,给你个思路.
第一,不知道你的a和b是什么类型的,如果是定义成浮点型,那么,可以这样写:
float f_Div = a/b;
如果两个有一个是整形的,那么,把整型强制转换成浮点型:
float f_Div = (float)a/(float)b;
注意,那个f_Div变量必须是float型,才能有小数产生

第二,你要进行显示,肯定要把各个位都取出来,这里面肯定有一个取模运算,就是"%",
对于浮点型,不运行取模运算的,所以,你必须把浮点型转换成整型,但是,不能强制转换,
比如: unsigned int I_Div = (unsigned int)f_Div;这是不可以的,你的小数部分就没有了.
所以,你必须要放大一定的倍数,根据你的要求,你是要保留三位,那么,这里还有个问题,你的
小数点之前有几位,决定了你小数点后面保留几位.
比如,你得到的结果是 1.2345,那么,你就保留1.23
如果你得到的结果是 12.345,那么,就保留12.3
如果你得到的结果是 123.45,你就只能保留123了
如果得到的结果是 0.123,你就只能保留 0.12

所以可以看出,你的浮点型结果整数部分有多少位,决定了你的小数能保留多少位,所以还要进行如下运算:

unsigned int i_Div = unsigned int)f_Div;;
unsigned char Dot_Bit = 0; //---这个变量用来表示在第几位上显示小数点,因为
//---通过下面的操作,已经把小数变成整数了
if(I_Div >= 100) //---表示前面有3个整数部分位

; //---那就没什么可操作的,unsigned int i_Div = unsigned int)f_Div;;就符合要求

else if (I_DIV >= 10) //---表示整数部分有2位

I_DIV = f_Div *10;
Dot_Bit = 1; //---在右数第2个地方显示小数点,也就是十位后显示小数点

else

I_DIV = f_Div *10;
Dot_Bit = 2; //---在右数第2个地方显示小数点,也就是最前面那位后面显示

void Display(void)


unsigned char Hundred = I_Div/100;
unsigned char TenBit = (I_Div/%00)/10;
unsigned char TenBit = I_Div%10;
....... //然后就开始显示了

参考技术A 浮点数本身就存在精度问题的
C51的float浮点类型只有七个重要的数字,在符合标准
IEEE-754浮点运算相比,整数运算是非常昂贵的CPU BR />长也并不适合大量的字符的计算方法,但很多的麻烦
参考技术B 程序就没有了
比如算10/3 = 3.333
直接算肯定没小数的

这样就可以了
10*1000/3 = 3333 你吧每一位都取出来 3 3 3 3
然后你再显示的时候就显示3 . 3 3 3 就可以了

51单片机c语言如何把浮点型转为字符串 ?

使用stdio.h中的sprintf函数转化即可:

#include <stdio.h>

float a = 1.234;
char str[10];
sprintf(str, "%f", a);

参考技术A 用一个联合体,可以把浮点数转换为字符型数据。
例如:

union f_to_char

uchar chr[4];
float ft0;
;

先把ft0赋值,然后chr[4]中就有了字符型数据。追问

很难理解

追答

这需要对C语言有足够的了解和熟悉,能灵活运用时就不难理解了。

以上是关于C51单片机浮点数运算的主要内容,如果未能解决你的问题,请参考以下文章

4-浮点数运算

Python 模拟32bit 浮点数运算

Python中整数运算除法,输出带浮点数

Java之浮点数运算

浮点数的加减运算都有哪些步骤

浮点数运算——加减乘除都有哈