Pergunta

Muitas vezes, é difícil encontrar a origem de um NaN, uma vez que pode acontecer em qualquer etapa de uma computação e propagar-se. Assim, é possível fazer um programa impasse C ++ quando um cálculo retorna NaN ou inf? O melhor na minha opinião seria a de ter um acidente com uma mensagem de erro agradável:

Foo: NaN encoutered at Foo.c:624

É algo como isso é possível? Você tem uma solução melhor? Como você depurar problemas NaN?

EDIT: Precisions:. Eu estou trabalhando com o GCC em Linux

Foi útil?

Solução

Você não pode fazê-lo de uma forma completamente portátil, mas muitas plataformas fornecer C APIs que permitem que você acessar o registro de controle de status de ponto flutuante (s).

Especificamente, você quer desmascarar o transbordamento e inválidos exceções de ponto flutuante, que fará com que o processador para sinalizar uma exceção quando aritmética em seu programa produz um resultado NaN ou infinito.

Em seu sistema linux isso deve fazer o truque:

#include <fenv.h> 
...
feenableexcept(FE_INVALID | FE_OVERFLOW);

Você pode querer aprender a escrever um manipulador de interceptação de modo que você pode imprimir uma mensagem de diagnóstico ou de outra forma continuar a execução quando uma dessas exceções é sinalizado.

Outras dicas

Sim! Set (talvez mais ou menos portably) seu processador de 754-compatível com IEEE para gerar uma interrupção quando um NaN ou infinito é encontrado.

Eu pesquisei e encontrei esses slides , que são um começo. O slide na página 5 resume todas as informações que você precisa.

Não sou especialista C, mas espero que a resposta é não.

  1. Isto exigiria todos os cálculos flutuador ter essa verificação. Um impacto no desempenho enorme.
  2. NaN e Inf não são maus. Eles podem ser legitimamente usada em alguma biblioteca seus usos de aplicativos, e quebrá-lo.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top