Qual é a solução recomendada se numeric_limits :: has_infinity é falsa?
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?
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
NaN
s 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.