ArrayFromFP8

Производит копирование массива типа uchar в массив типа float или double с заданным форматом.

bool   ArrayFromFP8(
   const float&         dst_array[],        // куда копируем
   const uchar&         src_array[],        // откуда копируем
   ENUM_FLOAT8_FORMAT   fmt                 // формат
   );

Перегрузка для типа double

bool   ArrayFromFP8(
   const double&        dst_array[],        // куда копируем
   const uchar&         src_array[],        // откуда копируем
   ENUM_FLOAT8_FORMAT   fmt                 // формат
   );

Параметры

dst_array[]

[out]  Массив-приемник типа float или double.

src_array[]

[in]  Массив-источник типа uchar.

fmt

[in]  Формат копирования из перечисления ENUM_FLOAT8_FORMAT.

 

Возвращаемое значение

Возвращает true в случае успеха, иначе false.

Примечание

Все виды формата FP8 определены в перечислении ENUM_FLOAT8_FORMAT и используются в MQL5 исключительно только для работы с ONNX моделями.

Если выходные параметры, полученные при выполнении функции OnnxRun, являются типом FP8 из перечисления ENUM_FLOAT8_FORMAT, то данная функция позволяет конвертировать результат в массивы типа float или double.

Формат FP8 (8-битное число с плавающей запятой) представляет собой один из типов данных, используемых для представления чисел с плавающей точкой. В FP8 каждое число представлено 8 битами данных, которые обычно разделяются на три компонента: знак, экспоненту и мантиссу. Этот формат обеспечивает компромисс между точностью и эффективностью хранения данных, что делает его привлекательным для использования в приложениях, где требуется экономия памяти и вычислительных ресурсов.

Благодаря компактному представлению чисел, FP8 позволяет уменьшить требования к памяти и ускорить вычисления. Кроме того, FP8 может быть полезен для реализации низкоуровневых операций, таких как арифметические вычисления и обработка сигналов.

Пример: функция из статьи Работа с ONNX-моделями в форматах float16 и float8

//+------------------------------------------------------------------+
//| RunCastFloat8Float                                               |
//+------------------------------------------------------------------+
bool RunCastFloat8ToFloat(long model_handle,const ENUM_FLOAT8_FORMAT fmt)
  {
   PrintFormat("TEST: %s(%s)",__FUNCTION__,EnumToString(fmt));
//---
   float test_data[15]   = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
   uchar data_float8[15] = {};
   if(!ArrayToFP8(data_float8,test_data,fmt))
     {
      Print("error in ArrayToFP8. error code=",GetLastError());
      OnnxRelease(model_handle);
      return(false);
     }
   U<ucharinput_float8_values[3*5];
   U<floatoutput_float_values[3*5];
   float    test_data_float[];
//--- convert float8 to float
   if(!ArrayFromFP8(test_data_float,data_float8,fmt))
     {
      Print("error in ArrayFromFP8. error code=",GetLastError());
      OnnxRelease(model_handle);
      return(false);
     }
   for(uint i=0i<data_float8.Size(); i++)
     {
      input_float8_values[i].value=data_float8[i];
      PrintFormat("%d input value =%f  Hex float8 = %s  ushort value=%d",i,test_data_float[i],ArrayToHexString(input_float8_values[i].uc),input_float8_values[i].value);
     }
   Print("ONNX input array: ",ArrayToString(input_float8_values));
//--- execute model (convert float8 to float using ONNX)
   if(!OnnxRun(model_handle,ONNX_NO_CONVERSION,input_float8_values,output_float_values))
     {
      PrintFormat("error in OnnxRun. error code=%d",GetLastError());
      OnnxRelease(model_handle);
      return(false);
     }
   Print("ONNX output array: ",ArrayToString(output_float_values));
//--- calculate error (compare ONNX and ArrayFromFP8 results)
   double sum_error=0.0;
   for(uint i=0i<test_data.Size(); i++)
     {
      double delta=test_data_float[i]-(double)output_float_values[i].value;
      sum_error+=MathAbs(delta);
      PrintFormat("%d output float %f = %s difference=%f",i,output_float_values[i].value,ArrayToHexString(output_float_values[i].uc),delta);
     }
//---
   PrintFormat("%s(%s): sum_error=%f\n",__FUNCTION__,EnumToString(fmt),sum_error);
   return(true);
  }

Смотри также

ArrayToFP8, ArrayCopy