FPU运算结果不对是精度问题?
浮点算法和PC上算得不一样,是不是单精度导致的误差?用MATLAB导出的参数建议做归一化。 是不是用了float但运算超出精度了? FPU默认用单精度的,double要特别处理。 你在Keil里选了硬件FPU没? 用printf输出也会有精度截断的。 尽量少做连续减法,误差会叠加。 确保启用了FPU相关寄存器。 我测过sin、cos,确实会偏。 你是不是混用了float和int? 会不会是优化等级太高影响表达式顺序? 在STM32F7上使用FPU(浮点运算单元)进行计算时,若结果与PC上不一致,通常由精度差异、编译器优化、算法实现差异或硬件限制导致
单精度 vs 双精度:STM32F7的FPU支持单精度(32位)浮点运算,而PC(如x86)可能默认使用双精度(64位
优化级别差异,PC编译器(如GCC/MSVC)可能启用更激进的优化(如自动向量化、指令重排),而嵌入式编译器(如ARM GCC)可能因资源限制优化较弱。
不同编译器可能生成不同的FPU指令序列(如VADD.F32 vs VMLA.F32),导致精度细微差异。
STM32F7的Cortex-M7 FPU基于ARMv7-M架构,与PC的x86 FPU或SSE/AVX指令集不同,运算顺序和舍入模式可能不同
默认舍入模式为“最近偶数舍入”,与PC可能不一致,导致边界值差异
嵌入式代码中若频繁将浮点结果转换为整数(如(int)value),会丢失精度 数值算法(如牛顿迭代法)对初始值敏感,微小差异可能导致结果发散或收敛到不同解
强制双精度计算(PC端):在PC代码中显式使用double类型,避免隐式转换为单精度。嵌入式端启用双精度(若硬件支持):STM32F7的FPU不支持硬件双精度,但可通过软件模拟(如long double),但性能极低
页:
[1]