Из float в массив uchar

 

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

Кто-нибудь сталкивался с задачей перевода числа типа 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;               
}
 
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
 
Marat Sultanov:

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

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

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

---

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

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

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

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

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

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

Спасибо!

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

 

Через OpenCL

))

 
Vladimir Kazakov:

Через OpenCL

))

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

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

 
Marat Sultanov:

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

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

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

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

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

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