ArrayFromFP8

Permite copiar un array de tipo uchar en un array de tipo float o double con el formato establecido.

bool   ArrayFromFP8(
   const float&         dst_array[],        // a dónde copiamos
   const uchar&         src_array[],        // de dónde copiamos
   ENUM_FLOAT8_FORMAT   fmt                 // formato
   );

Sobrecarga para el tipo double

bool   ArrayFromFP8(
   const double&        dst_array[],        // a dónde copiamos
   const uchar&         src_array[],        // de dónde copiamos
   ENUM_FLOAT8_FORMAT   fmt                 // formato
   );

Parámetros

dst_array[]

[out]  Array receptor del tipo float o double.

src_array[]

[in]  Array fuente del tipo uchar.

fmt

[in]  Formato de copiado de la enumeración ENUM_FLOAT8_FORMAT.

 

Valor retornado

Retorna true en el caso de éxito, de lo contrario, false.

Observación

Todos los tipos de formato FP8 se definen en la enumeración ENUM_FLOAT8_FORMAT y se usan en MQL5 sola y exclusivamente para trabajar con modelos ONNX.

Si los parámetros de salida obtenidos al ejecutar la función OnnxRun son de tipo FP8 de la enumeración ENUM_FLOAT8_FORMAT, esta función permitirá convertir el resultado a arrays de tipo float o double.

El formato FP8 (coma flotante de 8 bits) es uno de los tipos de datos usados para representar números en coma flotante. En FP8, cada número se representa con 8 bits de datos, que suelen dividirse en tres componentes: signo, exponente y mantisa. Este formato ofrece un compromiso entre precisión y eficiencia de almacenamiento, lo cual lo hace atractivo para su uso en aplicaciones en las que es necesario ahorrar memoria y recursos computacionales.

Con su representación compacta de los números, el FP8 puede reducir los requisitos de memoria y acelerar los cálculos. Además, el FP8 puede ser útil para implementar operaciones de bajo nivel, como cálculos aritméticos y procesamiento de señales.

Ejemplo: función del artículo Trabajamos con modelos ONNX en formatos float16 y 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);
  }

Ver también

ArrayToFP8, ArrayCopy