打印
[技术讨论]

KEIL C51 pow()函数误差

[复制链接]
813|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我使用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精度不够吗?

使用特权

评论回复
评论
baiyunfei.k.f 2025-7-24 10:45 回复TA
@xch :没有用到中断 
xch 2025-7-22 14:32 回复TA
测试运算函数前先禁了全局中断,然后看看运算结果 

相关帖子

沙发
飞思啦| | 2025-7-22 09:38 | 只看该作者
是否是库有问题,C库

使用特权

评论回复
板凳
baiyunfei.k.f|  楼主 | 2025-7-22 09:45 | 只看该作者
飞思啦 发表于 2025-7-22 09:38
是否是库有问题,C库

pow();幂函数是math.h里面的

使用特权

评论回复
地板
dffzh| | 2025-7-22 10:27 | 只看该作者
本帖最后由 dffzh 于 2025-7-22 10:34 编辑

你用的是8位单片机吧,程序中为什么要用浮点数作为pow的入参呢,你直接用pow(整型数据,整型数据)试试;
对于更大的指数(如28),虽然数值更大,但可能恰好落在能精确表示的区间。
另外,你可以用移位操作来代替pow函数实现你需要的功能,可以试一下效果。

使用特权

评论回复
5
xch| | 2025-7-22 14:25 | 只看该作者
我在IAR 中测试了 pow 函数,结果都是正确的。

使用特权

评论回复
6
xch| | 2025-7-22 14:30 | 只看该作者
设三个断点观察SpiTxCnt, 运算结果都与楼主说的“正确”结果相同。

使用特权

评论回复
7
R2D2| | 2025-7-22 15:02 | 只看该作者
再正常不过了,IEEE754单精度就是这个水平。

使用特权

评论回复
8
gaoyang9992006| | 2025-7-22 16:56 | 只看该作者
pow(2.0f, 26.0f) 的数学结果是 67,108,864(0x4000000),但 float 可能将其存储为近似值 67,108,952(误差+88)。

类似地,pow(2.0f, 27.0f) 的误差被放大到 +176。

而 pow(2.0f, 28.0f) 恰好能被 float 精确表示,因此结果正确。

使用特权

评论回复
评论
地瓜patch 2025-7-24 09:53 回复TA
给技术高点赞 
9
567| | 2025-7-23 23:00 | 只看该作者
本帖最后由 567 于 2025-7-23 23:02 编辑

不要说函数误差了。
你直接给一个浮点数赋值134217728,然后读出来看看是多少?
float的精度有限。

使用特权

评论回复
10
地瓜patch| | 2025-7-24 09:54 | 只看该作者
567 发表于 2025-7-23 23:00
不要说函数误差了。
你直接给一个浮点数赋值134217728,然后读出来看看是多少?
float的精度有限。 ...

这个思路好,写进去再读出来,就产生误差了

使用特权

评论回复
11
baiyunfei.k.f|  楼主 | 2025-7-24 10:53 | 只看该作者
dffzh 发表于 2025-7-22 10:27
你用的是8位单片机吧,程序中为什么要用浮点数作为pow的入参呢,你直接用pow(整型数据,整型数据)试试;
对 ...

是宏晶的51单片机。有个浮点数的运算要求。float pow   (float x, float y),形参是float类型

使用特权

评论回复
12
baiyunfei.k.f|  楼主 | 2025-7-24 10:55 | 只看该作者
xch 发表于 2025-7-22 14:25
我在IAR 中测试了 pow 函数,结果都是正确的。

用KEIL的arm编译器,在stm32上运行,结果也是正确的。用C51编译器,在51单片机上运行结果不对。

使用特权

评论回复
13
baiyunfei.k.f|  楼主 | 2025-7-24 10:56 | 只看该作者
xch 发表于 2025-7-22 14:30
设三个断点观察SpiTxCnt, 运算结果都与楼主说的“正确”结果相同。

STM32芯片运行结果是正确的

使用特权

评论回复
14
baiyunfei.k.f|  楼主 | 2025-7-24 13:39 | 只看该作者
567 发表于 2025-7-23 23:00
不要说函数误差了。
你直接给一个浮点数赋值134217728,然后读出来看看是多少?
float的精度有限。 ...

试了一下,读出来和赋值一样

微信图片_20250724133802.png (8.84 KB )

微信图片_20250724133802.png

微信图片_20250724133807.png (23.77 KB )

微信图片_20250724133807.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

117

主题

574

帖子

3

粉丝