本文将讨论浮点和定点。
浮点
IEEE754 32 位浮点(单精度)由 1 位符号、8 位指数和 23 位尾数表示。
示例:
十进制 85.125
浮点 0x42AA4000
这里不解释转换方法,但转换需要大量处理。
定点
不同公司使用定点数时有各自的规则。在这里,32 位定点由 1 位符号、15 位整数和 16 位小数点(1/65536)表示。
示例:
十进制 85.125
定点 85.125×65536 = 0x00552000
FPU (Floating Point Unit)
FPU是搭载于MCU核心的单元。当程序中声明浮点类型(float)时,搭载FPU的MCU与未搭载FPU的MCU存在以下差异。
FPU | 处理速度 | 代码值 | 价格 |
---|---|---|---|
搭载MCU(含FPU指令代码) | 快 | 少 | 高 |
未搭载MCU(不含FPU指令代码) | 慢 | 多 | 低 |
因此,没有 FPU 的 MCU 可以使用定点。
浮点数与定点数之间的区别
浮点运算和定点运算的区别如下。
decimal point | 标准 | 计算 | 表达范围 | 计算精度 |
---|---|---|---|---|
浮点数 | 标准 | 困难 | 广 | 高 |
定点数 | 每个公司的情况不同 | 简单 | 窄 | 低 |
即使使用了搭载FPU的MCU,若仍存在旧的遗留代码,则可能残留固定小数点代码,请务必注意。
浮点警告
在进行比较时应小心使用浮点数,因为结果如下。
float f = 0.1f * 10U; /* f = 0.99999994f */
if( f == 1.0f )
{
/* 可能不符合预期 */
}
例如,以下代码可用于与 0.0f 进行比较。
#define iEPSILON 1e-6f /* 计算误差 */
#define omABS_F(val) ( (val) < 0.0f ) ? -val ) /* 绝对值 */
#define omFLOAT_ZERO(val) ( omABS_F(val) < iEPSILON ) ? 0.0F /* 与 0.0f 至误差范围的比较 */