Вопрос

Я пытаюсь понять, как присвоить значение отрицательной бесконечности переменной с плавающей точкой или двойной переменной.Кажется, что, включая ограничения стандартной библиотеки, я могу получить представление бесконечности, и я знаю (совершенно точно), что добавление минуса перед этим (-бесконечность) может привести к значению, которое я ищу в формате с плавающей запятой IEEE754. стандарт (поскольку 0x7FFFFFFF может привести к 0xFFFFFFFF), но я даже не уверен в этом, не говоря уже о других стандартах, которые могут существовать (если они есть).Я считаю, что это действительно непрофессионально и зависит от реализации.

Конечно, есть ли хороший способ получить значение платформы и реализации отрицательной бесконечности независимо, в противном случае я мог бы с таким же успехом использовать #define, всем нравится предварительная обработка.

Это было полезно?

Решение

хотя бы, если std :: numeric_limits :: is_iec559 (IEEE 754) верно (который гарантирует, что std :: numeric_limits :: hav_infinity Также верно), вы можете выразить положительные и отрицательные значения бесконечности, как вы уже говорили.

Краткое объяснение IEEE 754-1985 Значения бесконечности из wikipedia :

...... Snip ......

поля предвзятого экспонанта заполнено всеми 1 битами, чтобы указать либо бесконечность или неверный результат вычисления.

<Сильная> положительная и отрицательная бесконечность

Положительная и отрицательная бесконечность представлены таким образом:

 sign = 0 for positive infinity, 1 for negative infinity.
 biased exponent = all 1 bits.
 fraction = all 0 bits.
.

...... Snip ......

<Сильные> Утверждения

В следующем примере либо будет работать, как ожидалось, или вызывает ошибку времени компиляции на случай, если целевая платформа не поддерживает IEEE 754 Float.

#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 см. Бесконечность и 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;

Однако, возможно, стоит рассмотреть возможность использования в вашем приложении наименьшего значения вместо отрицательной бесконечности, поскольку это, вероятно, приведет к более портативному решению.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top