找回密码
 立即注册
查看: 35|回复: 7

浮点数逻辑运算(比大小)错误,100%复现,求大神帮忙看看怎么回事

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-16 00:10:16

1

主题

11

回帖

213

积分

中级会员

积分
213
发表于 昨天 00:04 | 显示全部楼层 |阅读模式
硬件:AI8051U-34K64
配置:8Bit模式,链接器LX51,存储器和代码大小模式都是Large,工程由STC-AICube生成
开发环境:keil V5.27.1.0

代码:

void main(void)
{
    float tempf;
    SYS_Init();

    while (1)
    {
        WDT_Clear();                    //清看门狗定时器
        USBLIB_OUT_Done();              //查询方式处理USB接收的数据
                if(!P32){
                        delay_ms(6);
                        if(!P32){
                                USB_Send_str("\n\n float比大小测试:",USB_TX_NOTEND);
                                USB_Send_str("\n (11.34>=0):",USB_TX_NOTEND);
                                tempf = 11.34f;
                                if(tempf>=0) USB_Send_str("True",USB_TX_NOTEND);
                                else USB_Send_str("False",USB_TX_NOTEND);
                                USB_Send_str("\n (-11.34>=0):",USB_TX_NOTEND);
                                tempf = -11.34f;
                                if(tempf>=0) USB_Send_str("True",USB_TX_NOTEND);
                                else USB_Send_str("False",USB_TX_END);
                                while(!P32);
                        }
                        
                }
    }
}

输出:

float比大小测试:
                     (11.34>=0):False
                     (-11.34>=0):True


附件是我用AICube新生成的工程,只在main.c里加了USB_Send_str发送函数和上述测试代码;压缩包里也包含AICube配置文件。
此问题已在我手头多个开发板上稳定复现,另外:
1.把0改为±11.33以内的整数或浮点数都不影响输出,总是反过来的。
2.此代码在同样的平台上,32Bit模式下的输出是正常的。

2025-10-14测试.zip

3.39 MB, 下载次数: 3

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 昨天 15:13 | 显示全部楼层
截图202510151512531164.jpg

不使用8bit的tfpu库即可
应该是tfpu库中出现了纰漏,稍后我们检查修复
目前可以先屏蔽掉或者删除这个tfpu库,即可实现正常的判断
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-16 00:10:16

1

主题

11

回帖

213

积分

中级会员

积分
213
发表于 昨天 16:11 | 显示全部楼层
王*** 发表于 2025-10-15 15:13
不使用8bit的tfpu库即可
应该是tfpu库中出现了纰漏,稍后我们检查修复
目前可以先屏蔽掉或者删除这个tfpu ...

嗯嗯,刚刚我也测出来了,就是8bit的TFPU库有问题,跟其他因素应该无关
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-16 00:10:16

1

主题

11

回帖

213

积分

中级会员

积分
213
发表于 昨天 16:16 | 显示全部楼层
截图202510151615597789.jpg
这是我刚刚的测试结果,另外还发现了32Bit模式下,双large模式编译会报错;还有,设置主时钟为44.2368MHz时,USB模块不工作。什么bug发掘圣体......
哦,对了,以上所有测试都是使用AICube生成的工程。
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-10-15 17:10:56

30

主题

1175

回帖

4464

积分

超级版主

积分
4464
发表于 昨天 17:10 | 显示全部楼层
测试发现是由于Keil的8051和80251,对于浮点数比较函数C?FPCMP,R0~R7参数规范不一致导致的
硬件的浮点运算本身没问题

80251的C?FPCMP,R0~R3存放比较值(相比较的后面的数),R4~R7存放被比较值(相比较的前面的数)
8051的C?FPCMP,R4~R7存放比较值(相比较的后面的数),R0~R3存放被比较值(相比较的前面的数),正好和80251相反
如下图:
截图202510151656294399.jpg

后续我们需要更新一下8位的TFPU库就可以了
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-16 00:10:16

1

主题

11

回帖

213

积分

中级会员

积分
213
发表于 昨天 17:36 | 显示全部楼层
zh*** 发表于 2025-10-15 17:10
测试发现是由于Keil的8051和80251,对于浮点数比较函数C?FPCMP,R0~R7参数规范不一致导致的
硬件的浮点运算 ...

哦,怪不得,输出的结果正好是反过来的!
然后再请教一下,现在是只要在AICube里启用TPFU和MDU32库,在代码里的浮点数和三角函数相关运算,就会自动调用对应的硬件TPFU和DPU32模块么?以前很少使用库函数编程,见笑了

点评

是的,只要包含了TFPU和MDU32的库,Keil编译时就会自动调用 比如浮点数比较,keil有默认的C?FPCMP函数实现浮点数比较 如果我们自己重写相同函数名称C?FPCMP的代码,Keil就会优先调用我们自己写的库  详情 回复 发表于 昨天 17:51
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-10-15 17:10:56

30

主题

1175

回帖

4464

积分

超级版主

积分
4464
发表于 昨天 17:51 | 显示全部楼层
STm*** 发表于 2025-10-15 17:36
哦,怪不得,输出的结果正好是反过来的!
然后再请教一下,现在是只要在AICube里启用TPFU和MDU32库,在代 ...

是的,只要包含了TFPU和MDU32的库,Keil编译时就会自动调用

比如浮点数比较,keil有默认的C?FPCMP函数实现浮点数比较
如果我们自己重写相同函数名称C?FPCMP的代码,Keil就会优先调用我们自己写的库
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-10-16 00:10:16

1

主题

11

回帖

213

积分

中级会员

积分
213
发表于 昨天 18:21 | 显示全部楼层
zh*** 发表于 2025-10-15 17:51
是的,只要包含了TFPU和MDU32的库,Keil编译时就会自动调用

比如浮点数比较,keil有默认的C?FPCMP函数实 ...

感谢解惑!
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-16 03:26 , Processed in 0.118578 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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