如果变量具有INF或NAN值,如何将Variant的ChangeType浮动?

时间:2010-12-10 07:01:16

标签: c windows winapi variant

我在Variant中有浮动值,最初这个变体是bstr类型。 我使用 VariantChangeType 更改为浮点类型。然后我从它获得浮动值然后我转换为字节向量格式。

如果variant有浮点值,这可以正常工作。 如果variant具有 INF 值,则 VariantChangeType 会失败。所以我从variant.fltVal得到0。

如果变量具有INF或NAN值,如何将Type更改为float?我想在浮动中获得INF或NAN值。

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;
   }
}

1 个答案:

答案 0 :(得分:3)

伪语言

 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
 }

请注意,因为它是一个脆弱的解决方案:它依赖于无穷大和NaN的字符串表示,也许微软可以在没有警告的情况下更改它们。

这是雷蒙德·陈的非正式但权威的信息: What does -1.#IND mean?: A survey of how the Visual C runtime library prints special floating point values,即使与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

官方信息为printf Type Field Characters