baiyunfei 发表于 2025-7-21 17:27:35

KEIL C51 pow()函数误差

我使用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 发表于 2025-7-21 17:39:52

不是pow(20.0f, 260.0f),是pow(2.0f, 26.0f)

王昱顺 发表于 2025-7-22 11:39:20

是的,
float本身只能存储大概6位半到7位的有效数字,
上面个所述的“结果为67108952,但正确的结果应为67,108,864”,正确的位数为5位,
“结果为134217552,但正确的结果应为134,217,728”中,正确的位数为6位,
符合float本身的精度设计要求,所以这个是正常的

baiyunfei 发表于 2025-7-24 10:43:42

王昱顺 发表于 2025-7-22 11:39
是的,
float本身只能存储大概6位半到7位的有效数字,
上面个所述的“结果为67108952,但正确的结果应为67, ...

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

王昱顺 发表于 2025-7-24 11:04:20

baiyunfei 发表于 2025-7-24 10:43
但是这段程序换为arm编译器编译运行,其结果是正确的。和8位,32位平台也有关系。 ...

编译器对float的处理精度导致的
如果使用整数移位则是正确的

所以建议多使用整数方式进行计算

_奶咖君_ 发表于 2025-7-24 11:35:02

王昱顺 发表于 2025-7-24 11:04
编译器对float的处理精度导致的
如果使用整数移位则是正确的



又是天杀的编译器,,{:zhuakuang:}
页: [1]
查看完整版本: KEIL C51 pow()函数误差