Подтвердить что ты не робот

Является ли литье бесконечности целым числом undefined?

Является ли литье бесконечности (представленным float) целым числом a undefined поведение?

В стандарте говорится:

4.10 Плавающие интегральные преобразования

Значение типа с плавающей запятой может быть преобразовано в prvalue целочисленный тип. Преобразование усекает; то есть дробная часть отбрасывается. Поведение undefined, если усеченное значение не может быть представлены в типе назначения.

но я не могу сказать, охватывает ли "усеченное значение невозможно" бесконечность.

Я пытаюсь понять, почему std::numeric_limits<int>::infinity() и static_cast<int>(std::numeric_limits<float>::infinity() ) имеют разные результаты.

#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;
}

Вывод:

0  
-2147483648  

Результат std::numeric_limits<int>::infinity() четко определен и равен 0, но я не могу найти никакой информации о бесконечности кастинга.

4b9b3361

Ответ 1

Вы сказали

Я не могу сказать, означает ли "усеченное значение невозможно представить" охватывает бесконечность

но все это сводится к

Что является результатом усечения бесконечности.

Стандарт C (встроенный в С++ через 26.9) отвечает довольно просто:

Стандартная семантика C для <code> trunc </code>

Так как усечение бесконечности все еще бесконечно, и бесконечность не может быть представлена ​​в int (надеюсь, нет никаких вопросов об этой части), поведение undefined.

Ответ 2

Литье бесконечности в целое число undefined.

Поведение undefined, если усеченное значение не может быть представлено в целевом типе.

Говорит все это. Поскольку усечение удаляет точность, но не величину, усеченная бесконечность все еще бесконечна, и целые числа не могут представлять бесконечность.

Ответ 3

Я пытаюсь понять, почему std::numeric_limits<int>::infinity() и static_cast<int>(std::numeric_limits<float>::infinity() ) имеют разные результаты.

В стандарте говорится: 18.3.2.4

static constexpr T бесконечность() noexcept;

47 Представление положительной бесконечности, если доступно. [216]

48 Значение для всех специализаций, для которых has_infinity!= false. Требуется в специализациях, для которых is_iec559!= False.

--- изменить ---

В соответствии с 18.3.2.7/1 [числовой.специальный]

1 Все члены должны быть предоставлены для всех специализаций. Тем не менее, многие значения должны быть значимыми только при определенных условиях (например, epsilon() имеет смысл только в том случае, если is_integer является ложным). Любое значение, которое не является "значимым", должно быть равно 0 или false.