Is casting of infinity to integer undefined?

前端 未结 3 1753
日久生厌
日久生厌 2021-01-17 07:18

Is the casting of infinity (represented by float) to an integer an undefined behavior?

The standard says:

4.10 Floating-integral conversions<

相关标签:
3条回答
  • 2021-01-17 07:58

    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.

    0 讨论(0)
  • 2021-01-17 08:18

    I'm trying to understand why std::numeric_limits<int>::infinity() and static_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.

    0 讨论(0)
  • 2021-01-17 08:22

    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.

    0 讨论(0)
提交回复
热议问题