Скачать MetaTrader 5

Из float в массив uchar

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Marat Sultanov
11203
Marat Sultanov  

Здравствуйте уважаемые программисты,

Кто-нибудь сталкивался с задачей перевода числа типа float в массив uchar (или в битовый массив, не имеет значения) только средствами языка MQL?

При попытке реализовать конвертацию float, к сожалению, застрял :(

---

Демонстрирую мои успехи:

Код для перевода числа float в uchar[]:

bool ToUcharArray (float value,uchar & res_bytes[],const uint start=0)
{
   ArrayFill (res_bytes, start, 4, 0x00);
   
   bool ResBits[32]; ArrayInitialize(ResBits, false);
   int  ResBitsIndex = 31;
  
   int Exponent = 0;
  
  
//---mantiss
   bool MantissaBits[23]; ArrayInitialize(MantissaBits, false);
   int  MantissaBitIndex = 0;
   
   
   ulong IntVal      = (ulong)fabs(value);
   float SingleVal   = fabs(value) - IntVal;
   
   const bool ValIsNormal = IntVal > 0;
    
    
//---int
   bool IntMantissaBits[23]; ArrayInitialize(IntMantissaBits, false);
   int  IntMantissaBitIndex = 0;
   
   while (IntVal > 0 && IntMantissaBitIndex < 23)
   {
      IntMantissaBits[IntMantissaBitIndex] = (IntVal % 2) != 0;
      
      IntVal >>= 1;
      
      ++IntMantissaBitIndex;
      
      if (IntVal > 0) ++Exponent;
   }
   
   if (ValIsNormal)
   {
      for (int i=IntMantissaBitIndex-2; i>=0; --i)
      {
         MantissaBits[MantissaBitIndex] = IntMantissaBits[i];
         ++MantissaBitIndex;
      }
   }
   
//---signle
   bool NeedExponent = !ValIsNormal;
   
   while (MantissaBitIndex < 23 && SingleVal != 0)
   {
      SingleVal *= 2;
      
      if (SingleVal >= 1)
      {
         if (!NeedExponent)
         {  
            MantissaBits[MantissaBitIndex] = true;  
            ++MantissaBitIndex;
         }
         else
         {
            --Exponent;
            NeedExponent = false;
         }

         SingleVal = SingleVal - (uint)SingleVal;
      }
      else
      if (!NeedExponent) 
           ++MantissaBitIndex;
      else --Exponent;
   }


//---exponent
   bool ExponentBits[8]; ArrayInitialize(ExponentBits, false);
   
   Exponent = Exponent + 127;
   
   ToBitArray((uchar)Exponent, ExponentBits);
   
   
//---Res 
   ResBits[ResBitsIndex] = value < 0; --ResBitsIndex;
   
   for (int i=7; i>=0; --i)
   {
      ResBits[ResBitsIndex] = ExponentBits[i]; --ResBitsIndex;
   }  
   
   for (int i=0; i<23; ++i)
   {
      ResBits[ResBitsIndex] = MantissaBits[i]; --ResBitsIndex;
   } 
   
   
//---to bytes
   for (int i=0,b=0; i<32; i+=8, ++b) res_bytes[b] = ToUchar(ResBits, i);
   
   
   return true;               
}
Alexey Volchanskiy
24693
Alexey Volchanskiy  
Marat Sultanov:

Здравствуйте уважаемые программисты,

Кто-нибудь сталкивался с задачей перевода числа типа float в массив uchar (или в битовый массив, не имеет значения) только средствами языка MQL?

При попытке реализовать конвертацию float, к сожалению, застрял :(

---

Демонстрирую мои успехи:

Код для перевода числа float в uchar[]:

На плюсах делается за 5 сек с помощью арифметики указателей, а на MQL настоящих указателей нет. А вот эти библиотеки код смотрели? Я еще не разбирался, возможно, вам пригодится. Автор на форуме часто бывает.

https://www.mql5.com/ru/forum/95448

https://www.mql5.com/ru/forum/95447 

Библиотеки: TypeToBytes
Библиотеки: TypeToBytes
  • www.mql5.com
Форум трейдеров MQL5.community
Sergey Chalyshev
5707
Sergey Chalyshev  
Marat Sultanov:

Здравствуйте уважаемые программисты,

Кто-нибудь сталкивался с задачей перевода числа типа float в массив uchar (или в битовый массив, не имеет значения) только средствами языка MQL?

При попытке реализовать конвертацию float, к сожалению, застрял :(

---

Демонстрирую мои успехи:

Код для перевода числа float в uchar[]:

Может это поможет?
Marat Sultanov
11203
Marat Sultanov  
Sergey Chalyshev:
Может это поможет?
Спасибо! Но, к сожалению, там используются внешние библиотеки, т.е. не при помощи MQL...
Dmitry Fedoseev
47898
Dmitry Fedoseev  
Василий недавно писал какой-то код на эту тему, как бы его найти...
Marat Sultanov
11203
Marat Sultanov  
Alexey Volchanskiy:

На плюсах делается за 5 сек с помощью арифметики указателей, а на MQL настоящих указателей нет. А вот эти библиотеки код смотрели? Я еще не разбирался, возможно, вам пригодится. Автор на форуме часто бывает.

https://www.mql5.com/ru/forum/95448

https://www.mql5.com/ru/forum/95447 

Спасибо!

Это больше похоже на то, что я ищу. Пока, насколько я понимаю, нужно копать в сторону ArrayCopy. Но не уверен, пока, что это поможет, т.к. при копировании разных типов массивов происходит принудительное преобразование типов, что не есть гууд. Буду копать дальше...

Vladimir Kazakov
6891
Vladimir Kazakov  

Через OpenCL

))

Marat Sultanov
11203
Marat Sultanov  
Vladimir Kazakov:

Через OpenCL

))

Оригинально, однако :)

А как на счет надежности? 

Marat Sultanov
11203
Marat Sultanov  
Marat Sultanov:

Оригинально, однако :)

А как на счет надежности? 

C float должно получаться, при условии, что видюха поддерживает стандарт IEEE 754, а вот с double могут быть проблемки, т.к. далеко не все работают с двойной точностью, мало того, порой точность отличается от CPU...
Marat Sultanov
11203
Marat Sultanov  

Есть еще вариант, которым я пользуюсь, но это, все таки, не рентабельно.

Суть заключается в том, что нужно сначала число записать в бинарный файл, а потом прочитать 4 байта. Но это сойдет лишь для экспериментов и как очень временное решение :)

Marat Sultanov
11203
Marat Sultanov  
Dmitry Fedoseev:
Василий недавно писал какой-то код на эту тему, как бы его найти...
Прошу прощения, а можно узнать по больше об этом, уважаемом, "Василий", например его ник? :)
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий