硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1131|回复: 10
收起左侧

[MDK] MDK Bug?

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2024-7-16 10:43:04 | 显示全部楼层 |阅读模式
void BUG(double value, unsigned char *str, unsigned char cnt)
{
    static unsigned char i;
    static unsigned int n;

    n = (unsigned int)value;

    value -= n;

    for(i = 0; i < cnt; i++)
    {
        value *= 10;
    }
    n = (unsigned int)value;      //运行至此,value 等于4,对n赋值后,n却等于3   
}


unsigned char AA[20];
int  main(void)
{       
    BUG(1.4,AA,1);
     for(;;){}
}

运行BUG函数,在函数最后一行断点,发现 value 等于4,但是 n值为3  !!!!!!  ,编译器5和6 均有同样问题

回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
发表于 2024-7-16 11:44:53 | 显示全部楼层
四舍五入的问题吧,即使3.999999给int也是3
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-16 12:04:09 | 显示全部楼层
n = (unsigned int)value; 这个相当于取整,直接丢弃小数部分,没有四舍五入
标准库函数:
floor()是向下取整
ceil()是向上取整
round()是四舍五入
回复

使用道具 举报

4

主题

107

回帖

119

积分

初级会员

积分
119
发表于 2024-7-16 13:24:54 | 显示全部楼层
上位机也是这样的,这个涉及到数据的存储格式
微信图片_20240716132357.png
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-7-16 14:15:07 | 显示全部楼层
你这个程序有点问题,目标是保留n位小数,输入1.4保留一位小数是1.3,保留两位小数是1.39,double转字符串有不少现成的库,c库的sprintf和arduino的dtostrf
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-16 14:15:49 | 显示全部楼层
你的代码大概意图是:去掉value的整数部分,然后小数部分x10,再取整,得到value小数点后一位的具体数值
1. value = 1.4 = 1.399999999999999999
2. value = 0.399999999999999999 * 10 = 3.99999999999999999
3. 取整后为:3
答案正确
回复

使用道具 举报

21

主题

481

回帖

544

积分

金牌会员

积分
544
发表于 2024-7-16 14:18:09 | 显示全部楼层
我感觉你是按照整数的思路处理浮点数,会有问题
整数的“大于”,“等于”,“小于”这些概念,放在浮点数上不一定合适
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-7-16 14:38:57 | 显示全部楼层
h_007 发表于 2024-7-16 14:15
你的代码大概意图是:去掉value的整数部分,然后小数部分x10,再取整,得到value小数点后一位的具体数值
1 ...

运行到BUG函数最后一步,Value 等于4,不是3.999999啊
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2024-7-16 14:59:55 | 显示全部楼层
本帖最后由 caicaptain2 于 2024-7-17 15:32 编辑
h_007 发表于 2024-7-16 14:18
我感觉你是按照整数的思路处理浮点数,会有问题
整数的“大于”,“等于”,“小于”这些概念,放在浮点数 ...

浮点数的大于小于还是有效的。,就是不能有“等于”

计算机考试有个题目,判断两个浮点数是否等于,一般是浮点数相减小于某个较小的数,来代替等于。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2024-7-16 15:03:56 | 显示全部楼层
你的value是个浮点,不可能是4. 要么是4.00001,要么是3.99999之类的。
回复

使用道具 举报

219

主题

1109

回帖

1776

积分

至尊会员

More we do, more we can do.

积分
1776
发表于 2024-7-17 09:28:04 | 显示全部楼层
代码算出的是:3.999999999999999,因此取整后是3;
对其他网友回复的补充,4.0是可以准确表达的,HEX值为:0x4010000000000000;
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 20:43 , Processed in 0.044663 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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