2010-12-10 37 views
1

J'ai une valeur flottante dans Variant, Initialement, cette variante est un type bstr. J'utilise VariantChangeType pour passer au type flottant. et puis j'obtiens la valeur de flotteur de lui et alors je convertis en format de vecteur d'octet.Comment changer ChangeType de Variant pour flotter si variante ayant des valeurs INF ou NAN?

Si la variante a des valeurs flottantes, cela fonctionne correctement. Si la variante a INF valeurs, VariantChangeType obtient échoué. Donc je reçois 0 de variant.fltVal. Comment changer de type pour flotter si la variante possède des valeurs INF ou NAN? Je veux obtenir des valeurs INF ou NAN en float.

Convert(_variant_t varVal,vector<byte> dataArr) 
{ 
    HRESULT hr = VariantChangeType(varVal&, &varVal, 0 , VT_R4); 

    // Above code is failing if varVal.bstr contains 1.#INF" values 

    UINT size = 4; 
    if (data && dataItem.vt != VT_EMPTY) 
    { 
    float value = dataItem.fltVal; 
    BYTE tmpBuf[4]; 
    memcpy(tmpBuf, &value, sizeof(value)); 
    for(int i = size - 1 ; i >= 0 ; i--) 
    {  
     data->push_back(tmpBuf[i]); 
    }  
    retVal = TRUE; 
    } 
} 
+3

Pourquoi est-ce marqué 'c'? – unwind

Répondre

2

en pseudo-langue:

if (varVal.bstr.contains("1.#INF")) { 
    // assign plus infinity to your variant see http://stackoverflow.com/questions/2538339/infinity-in-msvc 
} else if (varVal.bstr.contains("-1.#INF")) { 
    // assign minus infinity to your variant see http://stackoverflow.com/questions/2538339/infinity-in-msvc 
} else if (varVal.bstr.contains("NaN") { 
    // assign NaN to your variant see http://stackoverflow.com/questions/235386/using-nan-in-c 
} else { 
    // your original working code for regular float values 
} 

S'il vous plaît faites attention car il est une solution fragile: elle repose sur les représentations de chaîne de l'infini et NaN et peut-être Microsoft peut les changer sans préavis.

Ceci est une information non officielle encore faisant autorité par Raymond Chen: What does -1.#IND mean?: A survey of how the Visual C runtime library prints special floating point values, même si elle n'a rien à voir VARIANT.

 
Output Meaning 
1#INF Positive infinity 
-1#INF Negative infinity 
1#SNAN Positive signaling NaN 
-1#SNAN Negative signaling NaN 
1#QNAN Positive quiet NaN 
-1#QNAN Negative quiet NaN 
1#IND Positive indefinite NaN 
-1#IND Negative indefinite NaN 

Une information officielle est printf Type Field Characters.