Является ли литье бесконечности (представленное float) целым числом неопределенным поведением?Является ли литье бесконечности целым неопределенным?
Стандарт говорит:
4.10 Плавающие-интегральные преобразования
prvalue типа с плавающей точкой может быть преобразовано в prvalue от типа целого числа. Преобразование усекает; то есть дробная часть отбрасывается. Поведение не определено, если укороченное значение не может быть представлено в типе назначения.
, но я не могу определить, является ли «усеченное значение не может быть представлено» охватывает бесконечность.
Я пытаюсь понять, почему 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()
is well defined и равным 0
, но я не могу найти какую-либо информацию о литье бесконечности.
Не забывайте, что 'std :: numeric_limits :: infinity()' полезно только в том случае, если 'std :: numeric_limits :: has_infinity == true', и это не так. –
NathanOliver
@NathanOliver, вы правы, но даже если определено 'has_infinity == false' результат' infinity() '. – Gluttton
Я уверен, что значение бесконечности не может быть представлено в 'int'. – aschepler