OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5579|回复: 5

MDK处理浮点数显示的数据不对是什么原因

[复制链接]

8

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-9-3
在线时间
0 小时
发表于 2013-9-10 15:15:09 | 显示全部楼层 |阅读模式
#define UART_RX_BUFFER_SIZE 128
unsigned char UART_RX_Buffer[UART_RX_BUFFER_SIZE];
unsigned short UART_Buffer_Top=0;
unsigned short UART_Buffer_Bom=0;
//存数据
float UART_GetFloat(void)
{
unsigned char*p;
float usTemp;
p = (unsigned char*)&usTemp;

*(p+3) = UART_RX_Buffer[UART_Buffer_Top++];
UART_Buffer_Top &= (UART_RX_BUFFER_SIZE-1);
*(p+2)= UART_RX_Buffer[UART_Buffer_Top++];
UART_Buffer_Top &= (UART_RX_BUFFER_SIZE-1);
*(p+1)= UART_RX_Buffer[UART_Buffer_Top++];
UART_Buffer_Top &= (UART_RX_BUFFER_SIZE-1);
*p= UART_RX_Buffer[UART_Buffer_Top++];
UART_Buffer_Top &= (UART_RX_BUFFER_SIZE-1);

return usTemp;
}
//读数据
void NumCtrlWriteFloat(unsigned short ID,unsigned char*p)
{
Send_Buffer[0] = ID>>8;
Send_Buffer[1] = (unsigned char) ID;
        Send_Buffer[2] = *(p+3);
Send_Buffer[3] = *(p+2);
Send_Buffer[4] = *(p+1);
Send_Buffer[5] = *(p+0);
UART_SendPacked(0xe5,Send_Buffer,6);
}

比如输入39.9却显示39.89999(取5位小数)或者39.8(取一位小数),请高手指点怎么,怎么能让它准确显示39.9呢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2013-9-10 17:14:34 | 显示全部楼层
无解!!!

照着IEEE标准的浮点数的运算,自己用笔和纸去算一下

第一步:小数39.9转化成二进制得
100111 . 1 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100(一直1100循环下去)
float的存储是这样的:1位符号位,8位阶码,23位尾数

第二步:

换算成科学计数, 
1.00111 1 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 110 x 2^5

第三步:

照着float的标准转化一下, 阶码5要转化成5+2^7=5+127=1000 0100
尾数最高位的1不要

符号位   阶码         尾数(23尾数)
   0    1000 0100   0011 1111 0011 0011 0011 001
39.9就被存储成了上面的模样了,尾数被截掉了


第四步:

把上面那个二进制数再次转化成十进制数, 然后就会得到39.89999
即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-9-10 18:06:49 | 显示全部楼层
确实无解。
所以浮点数里面判断2个数是否相等,不能直接用==,而是要用-N<A-B<N,其中N为浮点数的精度,比如0.00001。>
业余程序玩家。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-10 22:12:50 | 显示全部楼层
试试sprintf,能否解决这个问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-10-21
在线时间
13 小时
发表于 2018-7-15 17:38:33 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-7-15 19:17:10 | 显示全部楼层
输入的39.9在计算机内储存时出现了问题,存储的不是39.9了。这是因为浮点数的表示导致的。可以试试输入准确的39.9。怎么准确?我也在想。可以像2#楼一样手工转换成16进制输入。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 18:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表