找回密码
 立即注册
查看: 97|回复: 5

KEIL C51 pow()函数误差

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-07-24 10:43:42

1

主题

2

回帖

23

积分

新手上路

积分
23
发表于 2025-7-21 17:27:35 | 显示全部楼层 |阅读模式
我使用KEIL C51 9.6编译器,单片机STC12F2K60S2。软件中用到指数函数extern float pow   (float x, float y);。仿真发现运行pow(2.0f,26.0f),结果为67108952,但正确的结果应为67,108,864。运行pow(2.0f,27.0f),结果为134217552,但正确的结果应为134,217,728。但是运行pow(2.0f,28.0f)结果为268,435,456,结果正确。这是为什么呢?是float精度不够吗?
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-07-24 10:43:42

1

主题

2

回帖

23

积分

新手上路

积分
23
发表于 2025-7-21 17:39:52 | 显示全部楼层
不是pow(20.0f, 260.0f),是pow(2.0f, 26.0f)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:532
  • 最近打卡:2025-07-31 14:15:17
已绑定手机
已实名认证

116

主题

2499

回帖

6450

积分

版主

积分
6450
发表于 2025-7-22 11:39:20 | 显示全部楼层
是的,
float本身只能存储大概6位半到7位的有效数字,
上面个所述的“结果为67108952,但正确的结果应为67,108,864”,正确的位数为5位,
“结果为134217552,但正确的结果应为134,217,728”中,正确的位数为6位,
符合float本身的精度设计要求,所以这个是正常的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-07-24 10:43:42

1

主题

2

回帖

23

积分

新手上路

积分
23
发表于 7 天前 | 显示全部楼层
王*** 发表于 2025-7-22 11:39
是的,
float本身只能存储大概6位半到7位的有效数字,
上面个所述的“结果为67108952,但正确的结果应为67, ...

但是这段程序换为arm编译器编译运行,其结果是正确的。和8位,32位平台也有关系。

点评

编译器对float的处理精度导致的 如果使用整数移位则是正确的 [attachimg]109647[/attachimg] 所以建议多使用整数方式进行计算  详情 回复 发表于 7 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:532
  • 最近打卡:2025-07-31 14:15:17
已绑定手机
已实名认证

116

主题

2499

回帖

6450

积分

版主

积分
6450
发表于 7 天前 | 显示全部楼层
baiyu*** 发表于 2025-7-24 10:43
但是这段程序换为arm编译器编译运行,其结果是正确的。和8位,32位平台也有关系。 ...

编译器对float的处理精度导致的
如果使用整数移位则是正确的
截图202507241103524650.jpg
所以建议多使用整数方式进行计算
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:490
  • 最近打卡:2025-07-31 08:50:21

33

主题

2464

回帖

5329

积分

论坛元老

积分
5329
发表于 7 天前 | 显示全部楼层
王*** 发表于 2025-7-24 11:04
编译器对float的处理精度导致的
如果使用整数移位则是正确的

又是天杀的编译器,,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-31 22:55 , Processed in 0.113780 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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