2013-11-16 2 views
26

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

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

+0

Просто из любопытства, почему вы даже хотите -inf? –

+5

У меня есть график, и я хочу определить, какой из соседей лучше всего выбрать (это какой-то ИИ для игры), но функция, которая назначает число для каждого соседнего узла, может возвращать большие отрицательные числа. Чтобы проверить max, я хотел инициализировать переменную значением, которое по сравнению с чем угодно всегда приводило бы к «меньше», есть другие способы сделать это, конечно, но когда я не нашел -inf Постоянно мне стало любопытно, поскольку все другие языки программирования, которые я знаю, имеют определение как для положительных, так и для отрицательных значений бесконечности. – Setzer22

+0

Помогает ли [этот связанный вопрос] (http://stackoverflow.com/q/7973737/2065121)? –

ответ

25

По крайней мере, если верно 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; 
} 
+1

Btw, 'int main (void)' вместо 'int main()' и 'return EXIT_SUCCESS;' не нужны в C++. – jhasse

7

Если std::numeric_limits<double>::is_iec559 является true, то он должен быть безопасным для использования -

double negative_infinity = - std::numeric_limits<double>::infinity();

(IEC559 эквивалент ISO из IEEE754)

Если это false то есть гораздо больше работы, чтобы сделать так как я не думаю, что стандарт C++ дает вам любую помощь.

+1

'std :: numeric_limits :: has_infinity' теоретически может быть правдой даже на платформе, отличной от IEEE754, хотя я сомневаюсь, что многие из них существуют. –

+0

Правда, но это только гарантирует, что будет положительная бесконечность. Отрицательная бесконечность все еще не может быть представлена ​​при любой системе, и я не думаю, что есть какой-либо способ тестирования. –

3

Я не знаю, какой компилятор вы используете, но вы можете использовать -std::numeric_limits<double>::infinity() на НКУ и MinGW см Infinity-and-NaN. Кроме того, я побежал следующий код на MSVC и он вернулся верно:

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; 

Тем не менее, возможно, целесообразно рассмотреть с использованием самых низких в приложении вместо отрицательной бесконечности, поскольку это может привести к более портативные решения.

+0

Хорошая точка с использованием самого низкого, а не -inf, вы совершенно правы, на момент запроса я нашел лучшее решение на самом деле, я просто спрашивал из любопытства, но я буду учитывать это для будущих проблем Я мог бы – Setzer22

Смежные вопросы