Как Вариант ChangeType плавать, если вариант, имеющий значения INF или NAN? - PullRequest
1 голос
/ 10 декабря 2010

У меня есть значение с плавающей точкой в ​​Variant, изначально этот вариант имеет тип bstr. Я использую VariantChangeType , чтобы перейти к типу с плавающей точкой. а затем я получаю значение с плавающей запятой от него, а затем я преобразую в формат байтового вектора.

Если вариант имеет значения с плавающей запятой, это работает нормально. Если вариант имеет значения INF , VariantChangeType завершится неудачно. Так что я получаю 0 от варианта.fltVal.

Как поменять тип на плавающий, если вариант имеет значения INF или NAN? Я хочу получить значения INF или NAN в формате 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;
   }
}

1 Ответ

3 голосов
/ 19 февраля 2011

на псевдо-языке:

 if ( varVal.bstr.contains("1.#INF" ) ) {
   // assign plus infinity to your variant see /1752693/beskonechnost-v-msvc 
 } else if ( varVal.bstr.contains("-1.#INF" ) ) {
   // assign minus infinity to your variant see /1752693/beskonechnost-v-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, и, возможно, Microsoft может изменить их без предупреждения.

Это неофициальная, но авторитетная информация Раймонда Чена: Что означает -1. # IND ?: Обзор того, как библиотека времени выполнения Visual C печатает специальные значения с плавающей запятой , даже если она не связана с 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 Тип поля Символы .

...