浮点和定点

本文将讨论浮点和定点。

浮点

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 至误差范围的比较 */
OSS-ECAL Chinese
error: 内容受保护 !