Pergunta

Depois de olhar para outra pergunta sobre então (Usando NAN em C ++) Fiquei curioso sobre std::numeric_limits<double>::signaling_NaN().

Eu não conseguia fazer sinalização_nan lançar uma exceção. Eu pensei que talvez, sinalizando, isso realmente significou um sinal, então tentei pegar o Sigfpe, mas não ...

Aqui está o meu código:

double my_nan = numeric_limits<double>::signaling_NaN();
my_nan++;
my_nan += 5;
my_nan = my_nan / 10;
my_nan = 15 / my_nan;
cout << my_nan << endl;

numeric_limits<double>::has_signaling_NaN Avalia como verdadeiro, para que seja implementado no meu sistema.

Alguma ideia?

Estou usando o compilador C ++ do Visual Studio .NET 2003. Quero testá -lo em outro quando chegar em casa.

Obrigado!

Foi útil?

Solução

Você pode usar o _control87() função para ativar exceções de ponto flutuante. Da documentação do MSDN sobre _control87():

Observação:

As bibliotecas de tempo de execução mascaram todas as exceções de ponto flutuante por padrão.

Quando as exceções do ponto flutuante são ativadas, você pode usar signal() ou SEH (manuseio de exceção estruturada) para pegá -los.

Outras dicas

Uma palavra de aviso: o uso de DLLs de terceiros pode permitir silenciosamente essas exceções. Isso é especialmente verdadeiro para carregar DLLs que são escritos em um idioma que os permite por padrão.

Eu já tive isso em duas instâncias: imprimir de um controle de navegador incorporado a uma impressora HP e registrar minha DLL (que define alguns valores iniciais para NAN) da Innostup, que está escrito em Delphi.

A chave está em numeric_limits<T>::has_signaling_NaN. Qual valor isso tem para você? (O MSDN parece sugerir que é sempre false Para MSVC?)

A partir de Tfm:

cout << "The signaling NaN for type float is:  "
    << numeric_limits<float>::signaling_NaN( )
    << endl;

->

A nan de sinalização para o tipo de bóia é: 1.#qnan

onde o 'q' significa 'silencioso'. Não sei por que retornaria isso, mas é por isso que não faz uma exceção para você.

Por curiosidade, isso funciona melhor?

const double &real_snan( void )
{
    static const long long snan = 0x7ff0000080000001LL;
    return *(double*)&snan;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top