ArrayToFP8

Copie un tableau de type float ou double dans un tableau de type uchar avec le format donné.

bool   ArrayToFP8(
   const uchar&         dst_array[],        // destination
   const float&         src_array[],        // source
   ENUM_FLOAT8_FORMAT   fmt                 // format
   );

Surcharge pour le type "double"

bool   ArrayToFP8(
   const uchar&         dst_array[],        // destination
   const double&        src_array[],        // source
   ENUM_FLOAT8_FORMAT   fmt                 // format
   );

Paramètres

dst_array[]

[out]  Tableau destination de type uchar.

src_array[]

[in]  Tableau source de type float ou double.

fmt

[in]  Copie du format à partir de l'énumération ENUM_FLOAT8_FORMAT.

 

Valeur de Retour

Renvoie true en cas de succès ou false sinon.

Note

Tous les types de format FP8 sont définis dans l'énumération ENUM_FLOAT8_FORMAT et sont utilisés dans MQL5 uniquement pour les opérations avec des <li4 >modèles ONNX.

La fonction convertit les paramètres d'entrée de type float ou double en un des types FP8. Ces paramètres d'entrée sont ensuite utilisés dans la fonction OnnxRun.

FP8 (virgule flottante 8 bits) est l'un des types de données utilisés pour représenter les nombres à virgule flottante. Dans FP8, chaque nombre est représenté par 8 bits de données, généralement divisés en 3 composants : signe, exposant et mantisse. Ce format offre un équilibre entre précision et efficacité de stockage, ce qui le rend attrayant pour les applications nécessitant de la mémoire et de l'efficacité informatique.

En utilisant une représentation compacte des nombres, FP8 réduit les besoins en mémoire et accélère les calculs. De plus, FP8 peut être utile pour mettre en œuvre des opérations de bas niveau telles que des calculs arithmétiques et le traitement du signal.

Exemple : fonction issue de l'article Travailler avec des modèles ONNX aux formats float16 et 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);
  }

Voir également

ArrayFromFP8, ArrayCopy