2013-05-07 1 views
1

Qu'est-ce que cela signifie lorsqu'un programme C++ imprime le nombre suivant, et quelle est la signification de l'H à la fin?Interpréter l'impression d'un double dénormalisé en C++

-6.38442e-86H

L'ensemble du système est trop grand pour ajouter ici, est cependant ici le code qui imprimé double particulier.

try{ 
    newLogLikelihoodEM= hmm->learningLogLikelihood(data, Arglist::getDiffLogLikelihood(), fileNumbers, rng); 
} 
catch (SingularCovarianceMatrixException &scme) 
{ 
    std::cout << scme.what() << ": doing learning, so restarts for this start-point" << std::endl; 
    noRestarts++; 
    restart = true; 
} 

et la classe exception

class SingularCovarianceMatrixException: public std::exception 
{ 
    double det; 
public: 
    SingularCovarianceMatrixException(double det):det(det){}; 

    virtual const char* what() const throw() 
    { 

     std::stringstream msg; 
     msg<< "Singular covariance matrix: determinant="<<det; 

     return msg.str().c_str(); 
    } 
}; 

Et l'exception est levée par

if(*detCovarianceMatrix<1e-300) 
{ 
    throw SingularCovarianceMatrixException(*detCovarianceMatrix); 
} 
+5

Pouvez-vous ajouter le code qui génère cette sortie? – olevegard

+0

Ce n'est pas dénormal; les dénormaux commencent à '1.0p-1022', ~' 2.2250738585072014e-308'. – ecatmur

+0

Cela signifie que le programme fait quelque chose de plus que d'imprimer la valeur, mais il n'y a aucun moyen de savoir ce que c'est parce qu'il n'y a pas de code ici. –

Répondre

2

H ne fait pas partie du nombre. Ce n'est pas un suffixe valide pour un nombre à virgule flottante. Quelque chose d'autre dans votre code devrait l'imprimer.

+0

Vous avez oublié de répondre à l'autre partie de la question. – 0x499602D2

+0

@ 0x499602D2 Je suis désolé mais je ne comprends pas de quelle partie parlez-vous –

+0

* Qu'est-ce que cela signifie quand un programme C++ imprime le numéro suivant ...? * – 0x499602D2

1

H n'est pas un suffixe à virgule flottante valide, je ne peux pas trouver une bonne référence pour le prouver, mais on peut montrer que ce n'est pas une conversion valide en utilisant ce code:

#include <iostream> 
#include <sstream> 
#include <string> 
#include <stdexcept> 

class BadConversion : public std::runtime_error { 
public: 
    BadConversion(std::string const& s) 
    : std::runtime_error(s) 
    { } 
}; 

inline double convertToDouble(std::string const& s, 
           bool failIfLeftoverChars = true) 
{ 
    std::istringstream i(s); 
    double x; 
    char c; 
    if (!(i >> x) || (failIfLeftoverChars && i.get(c))) 
    throw BadConversion("convertToDouble(\"" + s + "\")"); 
    return x; 
} 

int main() 
{ 
    double d1 = convertToDouble("-6.38442e-86") ; 
    std::cout << d1 << std::endl ; 
    d1 = convertToDouble("-6.38442e-86H"); 
    std::cout << d1 << std::endl ; 
} 

Quel est le code que je pris de l'un de mes précédents answers sur la façon de vérifier si un string est un integer.

+0

'(istringstream (" - 6.38442e-86H ") >> x) .get (c)' aurait suffi pour faire valoir votre point de vue. – zakinster