Ответ 1
По крайней мере, если std:: numeric_limits:: is_iec559 (IEEE 754) истинно (что гарантирует, что std:: numeric_limits:: has_infinity также можно выразить положительные и отрицательные значения бесконечности так, как вы уже заявили.
Краткое описание значений бесконечности IEEE 754-1985 от Wikipedia:
...... надрез......
Поле смещенного экспоненты заполняется всеми 1 битом, чтобы указать либо бесконечность или неверный результат вычисления.
Положительная и отрицательная бесконечность
Положительная и отрицательная бесконечность представлены таким образом:
sign = 0 for positive infinity, 1 for negative infinity. biased exponent = all 1 bits. fraction = all 0 bits.
...... надрез......
утверждения
Следующий пример будет работать так, как ожидалось, или вызвать ошибку времени компиляции в случае, если целевая платформа не поддерживает поплавки IEEE 754.
#include <cstdlib>
#include <cmath>
#include <cassert>
#include <limits>
int main(void)
{
//Asserts floating point compatibility at compile time
static_assert(std::numeric_limits<float>::is_iec559, "IEEE 754 required");
//C99
float negative_infinity1 = -INFINITY;
float negative_infinity2 = -1 * INFINITY;
float negative_infinity3 = -std::numeric_limits<float>::infinity();
float negative_infinity4 = -1 * std::numeric_limits<float>::infinity();
assert(std::isinf(negative_infinity1) && negative_infinity1 < std::numeric_limits<float>::lowest());
assert(std::isinf(negative_infinity2) && negative_infinity2 < std::numeric_limits<float>::lowest());
assert(std::isinf(negative_infinity3) && negative_infinity3 < std::numeric_limits<float>::lowest());
assert(std::isinf(negative_infinity4) && negative_infinity4 < std::numeric_limits<float>::lowest());
return EXIT_SUCCESS;
}