Project

General

Profile

« Previous | Next » 

Revision 41bc7667

Added by shyouhei (Shyouhei Urabe) about 6 years ago

interesting (but annoying) tidbit warning suppressed

This changeset is to suppress clang's -Wimplicit-int-float-conversion
warning.

In 64 bit signed long and IEEE 754 double combination (== almost
everyone these days), LONG_MAX is 9,223,372,036,854,775,807. This
value is not exactly representable by double. The nearest value
that a double can represnt is 9,223,372,036,854,775,808. It is one
greater than LONG_MAX. Let's call this value the "x".

The expression LONG_MAX < yi is a long versus double comparison.
According to ISO/IEC 9899:1999 Section 6.3.1.8 (that defines the
"usual rithmetic conversions"), The long value must first be casted
into double. Because FLT_ROUNDS is typically 1 ("round to the
nearest" mode), the conversion yields the "x" value shown above. So
the comparison is in fact x < yi.

This comparison is false for yi == x situation, i.e. yi is still
bigger than LONG_MAX. On such situation the yn = (long)yi;
statement that appear several lines below renders underfined
behaviour, as per ISO/IEC 9899:1999 Section 6.3.1.3.

To remedy, we just change the comparison from < to <= so that
yi == x situation can properly be handled.