Is the casting of infinity (represented by float) to an integer an undefined behavior?
The standard says:
4.10 Floating-integral conversions<
Casting of infinity to integer is undefined.
The behavior is undefined if the truncated value cannot be represented in the destination type.
Says it all. Since truncation removes precision but not magnitude, a truncated infinity is still infinity and integers cannot represent infinity.
I'm trying to understand why
std::numeric_limits<int>::infinity()
andstatic_cast<int>(std::numeric_limits<float>::infinity() )
have different results.
The standard says: 18.3.2.4
static constexpr T infinity() noexcept;
47 Representation of positive infinity, if available. [216]
48 Meaningful for all specializations for which has_infinity != false. Required in specializations for which is_iec559 != false.
--- edit ---
According to 18.3.2.7/1 [numeric.special]
1 All members shall be provided for all specializations. However, many values are only required to be meaningful under certain conditions (for example, epsilon() is only meaningful if is_integer is false). Any value that is not “meaningful” shall be set to 0 or false.
You said
I can't tell whether "truncated value cannot be represented" covers infinity
but it all boils down to
What is the result of truncating infinity.
The C standard (incorporated into C++ via 26.9) answers that quite plainly:
Since truncation of infinity is still infinity, and infinity cannot be represented in int
(I hope there's no question about this part), the behavior is undefined.