Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересует активность в Маркете? Заходи и отслеживай!
Marat Sultanov
9063
Marat Sultanov 2016.09.14 20:25 

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

Кто-нибудь сталкивался с задачей перевода числа типа 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
16221
Alexey Volchanskiy 2016.09.14 21:59  
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
4274
Sergey Chalyshev 2016.09.14 22:04  
Marat Sultanov:

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

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

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

---

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

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

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

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

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

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

Спасибо!

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

Vladimir Kazakov
5520
Vladimir Kazakov 2016.09.14 22:34  

Через OpenCL

))

Marat Sultanov
9063
Marat Sultanov 2016.09.14 22:38  
Vladimir Kazakov:

Через OpenCL

))

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

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

Marat Sultanov
9063
Marat Sultanov 2016.09.14 22:45  
Marat Sultanov:

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

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

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

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

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

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