[STM32F1] 有些除法结果为零

[复制链接]
2336|23
Hitomi22 发表于 2025-9-17 22:32 | 显示全部楼层 |阅读模式
我正在做一个小项目,需要使用一个变量来保存PWM频率,STM32F103中有些除法结果为零,而实际结果应为浮点数而非零?为了计算周期,写了一个除法运算:1/test_float,结果应该是浮点数周期……但结果却是零。

我使用的是Blue Pill开发板(STM32F103)和STM32Cube IDE。

我运行了以下简单示例来展示这个问题:

float test_float = 0;

test_float = 1/10;    // ====> test_float=0
test_float = 1/1000;   // ====> test_float=0
test_float = 1/10000000; // ====> test_float=0
test_float = 0.0000001;  // ====> test_float= 9.9999999999999995e-008 (正确)
为什么前四行结果为零?最后一行(test_float = 0.0000001;)得到了正确值(100 ns)

sjnh 发表于 2025-9-18 07:27 | 显示全部楼层
这是C语言的特点,float test_float = 1 / 10;  实际过程是:首先右侧计算中没有浮点数,所以都按照整数计算结果=0,再把0转换成浮点数赋值给test_float; (不是先转换成浮点数再做除法);
例如 float v = 3/2; 结果是v=1,不是1.5;
要想正确必须是 1.0/10
sheflynn 发表于 2025-10-6 22:10 | 显示全部楼层
为什么最后一行是正确的?              
macpherson 发表于 2025-10-7 07:40 | 显示全部楼层
只保留商的整数部分,直接丢弃小数部分。
vivilyly 发表于 2025-10-7 19:49 | 显示全部楼层
使用 ​​STM32F4/F7/H7 系列
louliana 发表于 2025-10-7 21:12 | 显示全部楼层
两个 float 相除,编译器会进行浮点除法​
wilhelmina2 发表于 2025-10-8 10:07 | 显示全部楼层
使用 f 后缀              
maqianqu 发表于 2025-10-8 11:06 | 显示全部楼层
显式地将其中一个操作数转换为 float 类型。
pixhw 发表于 2025-10-8 13:21 | 显示全部楼层
C 语言会​​自动将整数提升为 float 再做除法​​
yeates333 发表于 2025-10-8 14:04 | 显示全部楼层
浮点数除法才是你想要的​              
hearstnorman323 发表于 2025-10-8 14:47 | 显示全部楼层
浮点运算的正确触发条件?              
louliana 发表于 2025-10-8 21:38 | 显示全部楼层
在性能关键代码中尽量避免浮点运算。
bartonalfred 发表于 2025-10-8 22:21 | 显示全部楼层
根源在于整数除法,而不是浮点数除法。
uytyu 发表于 2025-10-10 13:26 | 显示全部楼层
者是整数除法,后者是浮点数除法。
tifmill 发表于 2025-10-10 15:33 | 显示全部楼层
当一个操作数是浮点数,另一个是整数时,编译器会自动将整数提升为浮点数,然后执行浮点数除法。
yeates333 发表于 2025-10-11 14:46 | 显示全部楼层
使用定点数              
mmbs 发表于 2025-10-11 20:29 | 显示全部楼层
整数除法              
jf101 发表于 2025-10-12 22:16 | 显示全部楼层
当一个操作数是浮点数,另一个是整数时,编译器会自动将整数提升为浮点数,然后执行浮点数除法
qiufengsd 发表于 2025-10-17 10:30 | 显示全部楼层
​​整数除**丢弃小数部分,只保留整数商​
updownq 发表于 2025-10-17 12:39 | 显示全部楼层
整数除法的截断特性与浮点运算的显式类型转换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

68

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部