2015-02-23 8 views
1

Я нашел это: http://en.cppreference.com/w/cpp/numeric/math/isinf, но он, кажется, проверяет наличие положительной или отрицательной бесконечности. Я просто хочу проверить, равна ли значение точно отрицательной бесконечности, или в других словах является log (0)Лучший способ проверить, является ли double равным отрицательной бесконечности в C++

Спасибо за ответ! Основываясь на приведенном ниже ответе, вот какой код, который показывает, что работает.

#include <iostream> 
#include <cmath> 
#include <math.h> 
using namespace std; 
int main() 
{ 
    double c = std::log(0.0); 
    auto result = c == - INFINITY; 
    cout << result << endl; 
    return 0; 
} 
+3

Как насчет 'isinf' и' <0'? – Sinkingpoint

+0

Да, что сказал @Quirliom – hanshenrik

+1

Вы можете проверить значение бесконечности? * Mind blown * – marsh

ответ

5

x == -1.0/0.0

Это выражение истинно тогда и только тогда x отрицательная бесконечность.

Если вы желаете включить cmath, то x == - INFINITY более удобочитаемо.

Предполагая, что типы с плавающей точкой отображаются в форматы IEEE 754, каждый из них имеет свою бесконечность. 1.0/0.0 - double бесконечность. Не имеет большого значения тип INFINITY, потому что «обычные арифметические преобразования» позаботятся о совпадении типов левой и правой стороны от ==.

+0

Если вы не хотите включать '', вы можете использовать эти макросы:' #define POSINF (1.0/0.0) ',' #define NEGINF ((-1.0)/0.0) 'и' #define NAN (0.0/0.0). Вероятно, вы получите некоторые предупреждения о переполнении для констант, но они должны работать. –

+0

Я не понимал -Inf == -Inf, это на самом деле немного напоминает ошибку, но если это работает, работает для меня! – evolvedmicrobe

+0

Это зависит от платформы, нет? –

8

Как насчет очевидного и явного?

Чтобы проверить, что double x отрицательная бесконечность, проверьте

x == -std::numeric_limits<double>::infinity() 

Если x какой-то другой тип с плавающей точкой, изменить double соответствующие меры.

std::numeric_limits определен в стандартном заголовке <limits>. Не забудьте добавить его в свой список #include.