嵌入式没有 FPU 怎么算小数?用“分和元“讲透定点数(用分和元讲透(附代码))

发布时间:2026/7/15 10:08:49

嵌入式没有 FPU 怎么算小数?用“分和元“讲透定点数(用分和元讲透(附代码))
一句话: Cortex-M3 没有硬件浮点float 算一次几十条指令。定点数用整数存小数——像用分代替元——加减直接算乘法多一步移位。3 条指令干完 float 几十条指令的活。适合谁读适合嵌入式开发者、单片机初学者及遇到类似问题的工程师故事收银员不用元算账你去超市买了三样东西薯片 3.50 元 可乐 2.25 元 纸巾 1.25 元收银员不会列竖式3.50 2.25 1.25 ─────── 7.00他算的是350 分 225 分 125 分 700 分 7.00 元先把小数全转成整数用整数算完最后再转回去。计算机做定点运算干的就是同一件事——只不过它放大的是 256 倍、65536 倍这种 2 的幂次因为 CPU 移位比除法快一万倍。为什么要折腾直接用 float 不行吗你的 ADuCM431 是 Cortex-M3没有硬件 FPU。// 你写这一行 float current adc_code * 0.000389f;编译器背后干了什么它调了软浮点库调用 __aeabi_fmul浮点乘法约 20 条指令 调用 __aeabi_f2uiz浮点转整数约 10 条指令一行代码 几十条指令。主循环每 100ms 跑一次8 路通道 × 3 个公式 24 次浮点运算 好几百条指令。CPU 的时间全在算 0.000389。换成定点// 0.000389 ≈ 255 / 65536 uint32_t current (adc_code * 255U) 16;一行代码 1 条乘法 1 条移位 2 条指令。核心原理约定小数点在哪用一个 16 位整数代表小数约定前 8 位是整数后 8 位是小数存的值: 384 把它当成元和分来读: 384 ÷ 256 1 → 整数部分 384 % 256 128 → 128/256 0.5 实际值 1.5就这么简单。存的是普通整数 384但你和程序约定好了——读的时候要 ÷ 256。UQ 格式命名UQm.nU 无符号m 整数位数n 小数位数。格式放大倍数范围精度UQ12.4×160 ~ 4095.93750.0625UQ8.8×2560 ~ 255.9960.0039UQ0.16×655360 ~ 0.999980.000015UQ16.16×655360 ~ 65535.999980.000015小数位越多精度越高但整数范围越小。你的项目里 ADC 是 12 位0~4095用 UQ16.1632 位最合适——又装得下、又够精确。四个基本运算规定所有值都先 ×65536 变成整数算完再 ÷65536。加法直接加// 1.5 2.25 3.75 uint32_t a 1.5f * 65536; // 98304 uint32_t b 2.25f * 65536; // 147456 uint32_t c a b; // 245760 float r c / 65536.0f; // 3.75 ✓乘法乘完要缩回来两个 ×65536 的数相乘结果被放大了 65536×65536 倍所以要除掉一次// 1.5 × 2.25 3.375 uint32_t a 1.5f * 65536; // 98304 uint32_t b 2.25f * 65536; // 147456 uint32_t c ((uint64_t)a * (uint64_t)b) 16; // 乘完右移 16 位 float r c / 65536.0f; // 3.375 ✓关键点乘积用 64 位存uint64_t因为 32 位 × 32 位 64 位 16是除以 65536把多放大的部分消掉除法被除数先放大// 1.5 ÷ 2.25 0.6667 uint32_t a 1.5f * 65536; // 98304 uint32_t b 2.25f * 65536; // 147456 uint32_t c ((uint64_t)a 16) / b; // 先左移再除 float r c / 65536.0f; // 0.6667 ✓被除数先左移放大再做整数除法结果才够精度。不然整数除法会截断小数部分。Q 格式转换不同模块可能用不同 Q 格式切换只需移位// Q12 → Q16: 左移 4 位 uint32_t q16 q12 4; // Q16 → Q12: 右移 4 位 uint32_t q12 q16 4;实战ADC 算偏置电流你的项目里偏置电流公式是I_bias (A) ADC_CODE × 0.000389CMIS 要求单位是 100μA所以还要 ×10000// 浮点写法慢 float bias_A adc_code * 0.000389f; uint16_t bias_100uA (uint16_t)(bias_A * 10000.0f); // 定点写法快 // 系数 0.000389 ≈ 25 / 65536 // bias_100uA adc_code × 25 / 65536 × 10000 // adc_code × 250000 / 65536 // adc_code × 15625 / 4096 uint32_t bias_100uA ((uint32_t)adc_code * 15625UL) 12;一条乘法 一条移位。没有浮点没有除法的延迟。再举个例子ADC 算电压电路VREF(2.5V) → 10KΩ 固定电阻 → ADC → NTC → GNDR_ntc 10000 × ADC / (4095 - ADC)定点版// 用 UQ16.16放大 65536 倍 uint32_t r_ntc_uq16 (10000UL * (uint32_t)adc_code * 65536UL) / (4095UL - (uint32_t)adc_code); // 读数: r_ntc r_ntc_uq16 / 65536总结类比定点运算收银员用分记账程序用整数存小数350 分 3.50 元× 256 整数加减分直接加减同 Q 格式直接加减乘法(分×分)÷100乘完再右移 n 位除法(分×100)÷分先左移 n 位再除三句话存的时候小数 × 65536 → 整数算的时候加减直接算乘法多一步右移读的时候整数 ÷ 65536 → 小数没有浮点单元不是问题——用整数假装小数又快又准。有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。

相关新闻

设计状态机时,先画转换条件,再画状态

设计状态机时,先画转换条件,再画状态

2026/7/15 10:08:49

一句话: 很多人设计状态机先枚举"有哪些状态"再想"怎么转换",容易漏掉转换路径。反过来:先画条件矩阵——每个条件组合下应该发生什么——状态自然浮现。适合谁读:适合嵌入式开发者、单片机初学者及遇到类似问题的工程师…

改完Keil工程文件被缓存覆盖?——uvprojx编辑的进阶四坑

改完Keil工程文件被缓存覆盖?——uvprojx编辑的进阶四坑

2026/7/15 10:08:49

一句话: 上一篇《Keil工程XML编辑5次失败》讲了基本流程。本文进阶——Perl 静默失败的根因、Keil 缓存回写的时间点、uvoptx 里有 uvprojx 没有的东西、sed 一刀切误伤活跃代码。如果你不止删文件,还要批量改工程配置,这四条会帮你少踩一轮坑。 适合谁读…

KAN网络:新一代可解释神经网络架构解析

KAN网络:新一代可解释神经网络架构解析

2026/7/15 10:08:49

1. KAN网络是什么?为什么它能引发热议?KAN(Kolmogorov–Arnold Networks)是2024年由MIT、加州理工等机构提出的全新神经网络架构。它的核心创新点在于对传统MLP(多层感知器)做了一个看似简单却影响深远的改…

(电赛)信号处理类报告撰写实战:从框架搭建到得分要点精讲

(电赛)信号处理类报告撰写实战:从框架搭建到得分要点精讲

2026/7/15 11:38:53

1. 信号处理类电赛报告的核心价值参加过电赛的同学都知道,报告在评分中往往占到30%-50%的比重。我当年第一次参赛时,硬件做得不错,但因为报告写得像实验记录本,最终与奖项擦肩而过。信号处理类题目尤其特殊——评委可能无法现场验…

Awesome Rust Streaming项目贡献指南:如何为这个社区列表添加你的发现

Awesome Rust Streaming项目贡献指南:如何为这个社区列表添加你的发现

2026/7/15 11:38:53

Awesome Rust Streaming项目贡献指南:如何为这个社区列表添加你的发现 【免费下载链接】awesome-rust-streaming A community curated list of Rust Language streamers 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-rust-streaming Awesome Rust S…

MATLAB双三次插值算法实现与优化详解

MATLAB双三次插值算法实现与优化详解

2026/7/15 11:38:53

1. 双三次插值的基本原理双三次插值(Bicubic Interpolation)是图像处理领域中最常用的插值算法之一,它通过考虑目标像素周围16个邻近像素的灰度值,利用三次多项式插值函数来计算新像素值。与最近邻插值和双线性插值相比&#xff0…

pytest框架全面解析:Python测试自动化的终极解决方案

pytest框架全面解析:Python测试自动化的终极解决方案

2026/7/15 11:38:53

pytest框架全面解析:Python测试自动化的终极解决方案 【免费下载链接】pytest The pytest framework makes it easy to write small tests, yet scales to support complex functional testing 项目地址: https://gitcode.com/GitHub_Trending/py/pytest pyt…

Hermes WebUI高效三容器部署实战:Agent+WebUI+Dashboard完整配置指南

Hermes WebUI高效三容器部署实战:Agent+WebUI+Dashboard完整配置指南

2026/7/15 11:38:53

Hermes WebUI高效三容器部署实战:AgentWebUIDashboard完整配置指南 【免费下载链接】hermes-webui Hermes WebUI: The best way to use Hermes Agent from the web or from your phone! 项目地址: https://gitcode.com/GitHub_Trending/he/hermes-webui 在当…

AI时代必须亲手做的5个research底线动作

AI时代必须亲手做的5个research底线动作

2026/7/15 11:28:53

1. 这不是危言耸听,而是我带了7个实习生后的真实观察“AI 越强,你越要保留自己做 research 的能力”——这句话我去年在组内分享会上说完,有位刚入职三个月的校招生当场举手问:“老师,我现在写周报都靠 Copilot 补全&a…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/14 10:03:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/13 20:43:19

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/15 0:26:43

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

【LINUX】驱动

【LINUX】驱动

2026/7/15 0:08:14

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

2026/7/15 0:08:14

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

2026/7/15 0:08:14

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…