Break on NaNs ou infs
-
05-07-2019 - |
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
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.
- Isto exigiria todos os cálculos flutuador ter essa verificação. Um impacto no desempenho enorme.
- NaN e Inf não são maus. Eles podem ser legitimamente usada em alguma biblioteca seus usos de aplicativos, e quebrá-lo.