1

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

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

如果变体具有 INF 或 NAN 值,如何将类型更改为浮动?我想在浮点数中获取 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;
   }
}
4

1 回答 1

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 的字符串表示,也许微软可以在没有警告的情况下更改它们。

这是 Raymond Chen 提供的非官方但权威的信息: -1.#IND 是什么意思?:对 Visual C 运行时库如何打印特殊浮点值的调查,即使它与VARIANT.

输出含义
1#INF 正无穷大
-1#INF 负无穷大
1#SNAN 正信号 NaN
-1#SNAN 负信号 NaN
1#QNAN 正静NaN
-1#QNAN 负安静 NaN
1#IND 正不定 NaN
-1#IND 负不定 NaN

官方信息是printfType Field Characters

于 2011-02-19T17:03:47.460 回答