Floating point and Fixed point

This post describes Floating point and Fixed point.

Floating point

IEEE754 32-bit floating point (single precision) is represented by 1-bit sign, 8-bit exponent, and 23-bit mantissa.

Ex)
Decimal        85.125
Floating point  0x42AA4000
I will not explain the conversion process in this post, but the conversion requires a lot of processing.

Fixed point

I believe that each company uses fixed points with its own set of rules. In this submission, 32-bit fixed-point is expressed as 1-bit sign, 15-bit integer, and 16-bit decimal point (1/65536).

Ex)
Decimal     85.125
Fixed point  85.125×65536 = 0x00552000

FPU (Floating Point Unit)

FPU is a Unit in the Core of the MCU. When you declare floating point (float) in your program, there are the following differences between MCUs with FPU and MCUs without FPU.

FPUProcessing speedCode valuePrice
MCU with FPU (with FPU instruction code)FastSmallHigh
MCU without FPU (without FPU instruction code)SlowLargeLow

Therefore, there are cases where MCUs without FPUs use a fixed decimal point.

Difference between floating point and fixed minority point

The following differences exist between floating-point and fixed-point systems.

PointStandardCalculationRange of expressionCalculation accuracy
Floating pointStandards.difficultwideHigh
Fixed pointEach company is differenteasynarrowLow

Please note that even when using an FPU-equipped MCU, fixed-point code may remain if old legacy code is still present.

Floating Point Caution

When comparing floating-point numbers, please be aware that the results may differ as shown below.

float f = 0.1f * 10U;      /* f = 0.99999994f */

    if( f == 1.0f )
    {
        /* May not meet expectations */
    }

For example, the following code may be used for a comparison with 0.0f.

#define iEPSILON            1e-6f                               /* Margin of error */
#define omABS_F(val)        ( (val) < 0.0f ) ? -val )           /* Absolute value */
#define omFLOAT_ZERO(val)   ( omABS_F(val) < iEPSILON ) ? 0.0F  /* Comparison with 0.0f within the margin of error */
OSS-ECAL English
error: Content is protected !!