Pergunta

Eu preciso verificar um valor duplo para o infinito em um aplicativo C ++ no Linux. Na maioria das plataformas isso funciona comparando com std::numeric_limits<double>::infinity(). No entanto, em algumas plataformas antigas (RedHat 9 por exemplo, com gcc 3.2.2), este não está disponível, e std::numeric_limits<double>::has_infinity é falsa lá.

O que solução alternativa que você recomendaria para essas plataformas?

Foi útil?

Solução 3

Ok, eu já recorreram ao uso das macros INFINITY e NAN dessa máquina - parece funcionar bem. Eles vêm de math.h.

Outras dicas

Se você estiver usando aritmética IEEE 754, como você quase certamente são, infinitos são bem valores definidos e definiram os resultados para todas as operações aritméticas. Em particular,

infinity - infinity = NaN
valores

positivo e negativo infinito e NaN são os únicos valores para os quais isso é verdade. NaNs são valores especiais "não-um-número" usado para indicar erros de domínio de funções, por exemplo, sqrt(-1). Também:

NaN != NaN

NaNs são os únicos valores para os quais isso é verdade.

Por isso:

bool is_infinite(double x) {
    double y = x - x;
    return x == x && y != y;
}

retornará true se e somente se x é positivo ou negativo infinito. Adicionar um teste para x > 0 se só deseja verificar se há infinito positivo.

Na maioria dos casos, std :: numeric_limits :: max () pode ser um substituto válido para std :: numeric_limits :: infinito ().

Você teria que ser mais cuidadosa sobre a usá-lo, no entanto. Com transborda Eu acredito que você teria para detectar manualmente o transbordamento e definir o resultado ao máximo explicitamente se um excesso for detectado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top