The 8051 does not contain an interrupt vector to trap floating point errors; therefore, your software must appropriately respond to these error conditions.
In addition to the normal floating-point values, a floating-point number may contain a binary error value. These values are defined as a part of the IEEE standard and are used whenever an error occurs during normal processing of floating-point operations. Your code should check for possible arithmetic errors at the end of each floating-point operation.
Name |
Value |
Meaning |
NaN |
0xFFFFFFFF |
Not a number |
+INF |
0x7F800000 |
Positive infinity (positive overflow) |
-INF |
0xFF800000 |
Negative infinity (negative overflow) |
NOTE
The C51 library function _chkfloat_ allows you to quickly check floating-point status
union f
{
float f; /* Floating point value */
unsigned long ul; /* Unsigned long value */
};
This union contains a float and an unsigned long in order to perform floating-point math operations and to respond to the IEEE error states. For example:
#define NaN 0xFFFFFFFF /* Not a number (error) */
#define plusINF 0x7F800000 /* Positive overflow */
#define minusINF 0xFF800000 /* Negative overflow */
union f
{
float f; /* Floating point value */
unsigned long ul; /* Unsigned long value */
};
void main (void)
{
float a, b;
union f x;
x.f = a * b;
if (x.ul == NaN || x.ul == plusINF || x.ul == minusINF)
{
/* handle the error */
}
else
{
/* result is correct */
}
}