Является ли литье бесконечности целым числом 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
, но я не могу найти никакой информации о бесконечности кастинга.
Ответы
Ответ 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.