Reputation: 5968
Is the casting of infinity (represented by float) to an integer an undefined behavior?
The standard says:
4.10 Floating-integral conversions
A prvalue of a floating point type can be converted to a prvalue of an integer type. The conversion truncates; that is, the fractional part is discarded. The behavior is undefined if the truncated value cannot be represented in the destination type.
but I can't tell whether "truncated value cannot be represented" covers infinity.
I'm trying to understand why std::numeric_limits<int>::infinity()
and static_cast<int>(std::numeric_limits<float>::infinity() )
have different results.
#include <iostream>
#include <limits>
int main ()
{
std::cout << std::numeric_limits<int>::infinity () << std::endl;
std::cout << static_cast<int> (std::numeric_limits<float>::infinity () ) << std::endl;
return 0;
}
Output:
0
-2147483648
The result of std::numeric_limits<int>::infinity()
is well defined and equal to 0
, but I can't find any information about casting infinity.
Upvotes: 31
Views: 5365
Reputation: 24249
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.
Upvotes: 6
Reputation: 283634
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.
Upvotes: 16
Reputation: 1871
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.
Upvotes: 27