The object representation for floating-point values is implementation defined. However, an implementation that defines the
__STDC_IEC_559__ macro shall conform to the IEC 60559 floating-point standard and uses what is frequently referred to as IEEE 754 floating-point arithmetic [ISO/IEC 9899:2011]. The floating-point object representation used by IEC 60559 is one of the most common floating-point object representations in use today.
All floating-point object representations use specific bit patterns to encode the value of the floating-point number being represented. However, equivalence of floating-point values is not encoded solely by the bit pattern used to represent the value. For instance, if the floating-point format supports negative zero values (as IEC 60559 does), the values
0.0 are equivalent and will compare as equal, but the bit patterns used in the object representation are not identical. Similarly, if two floating-point values are both (the same) NaN, they will not compare as equal, despite the bit patterns being identical, because they are not equivalent.
Do not compare floating-point object representations directly, such as by calling
memcmp()or its moral equivalents. Instead, the equality operators (
!=) should be used to determine if two floating-point values are equivalent.
Noncompliant Code Example
In this noncompliant code example,
memcmp() is used to compare two structures for equality. However, since the structure contains a floating-point object, this code may not behave as the programmer intended.
In this compliant solution, the structure members are compared individually:
Using the object representation of a floating-point value for comparisons can lead to incorrect equality results, which can lead to unexpected behavior.
|Axivion Bauhaus Suite|
|LDRA tool suite|
|618 S||Enhanced Enforcement|
Do not use object representations to compare floating-point values
|CERT C: Rule FLP37-C||Checks for memory comparison of floating-point values (rule fully covered)|
|[ISO/IEC 9899:2011]||Annex F, "IEC 60559 floating-point arithmetic"|