Отрицательная бесконечность
Я пытаюсь выяснить, как присвоить значение отрицательной бесконечности переменной с плавающей запятой или двойной переменной. Кажется, что, включив стандартные ограничения библиотеки, я могу получить представление бесконечности, и я знаю (совершенно точно), что добавление минуса перед этим (-infinity) может привести к значению, которое я ищу в плавающей точке IEEE754 стандарт (так как 0x7FFFFFFF может привести к 0xFFFFFFFF), но я даже не уверен в этом, не говоря уже о других стандартах, которые могут быть там (если они есть). Я нахожу это действительно, действительно непрофессиональным и зависящим от реализации.
Есть ли хороший способ получить значение отрицательной бесконечности платформы и реализации независимо друг от друга, конечно, в противном случае я мог бы просто использовать #define, всем нравится предварительная обработка.
3 ответа
По крайней мере, если std:: numeric_limits:: is_iec559 (IEEE 754) имеет значение true (что гарантирует, что std::numeric_limits::has_infinity также имеет значение true), вы можете выражать положительные и отрицательные значения бесконечности так, как вы уже указали.
Краткое объяснение значений бесконечности IEEE 754-1985 из Википедии:
...... надрез......
Поле смещенной экспоненты заполняется всеми 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;
}
Если std::numeric_limits<double>::is_iec559
является true
тогда это должно быть безопасно для использования -
double negative_infinity = - std::numeric_limits<double>::infinity();
(IEC559 является ISO-эквивалентом IEEE754)
Если это false
тогда есть еще много работы, поскольку я не думаю, что стандарт C++ поможет вам.
Я не знаю, какой компилятор вы используете, но вы можете использовать -std::numeric_limits<double>::infinity()
на gcc и MinGw см. Infinity-and-NaN. Также я запустил следующий код на MSVC, и он вернул true:
double infinity(std::numeric_limits<double>::infinity());
double neg_infinity(-std::numeric_limits<double>::infinity());
double lowest(std::numeric_limits<double>::lowest());
bool lower_than_lowest(neg_infinity < lowest);
std::cout << "lower_than_lowest: " << lower_than_lowest << std::endl;
Однако, возможно, стоит подумать об использовании минимального в вашем приложении вместо отрицательной бесконечности, так как это может привести к более портативному решению.