ArrayToFP8

Kopiert ein Array vom Typ float oder double in ein Array vom Typ uchar mit dem angegebenen Format.

bool   ArrayToFP8(
   const uchar&         dst_array[],        // copy to
   const float&         src_array[],        // copy from
   ENUM_FLOAT8_FORMAT   fmt                 // format
   );

Überladung für den Typ double

bool   ArrayToFP8(
   const uchar&         dst_array[],        // copy to
   const double&        src_array[],        // copy from
   ENUM_FLOAT8_FORMAT   fmt                 // format
   );

Parameter

dst_array[]

[out]  Empfänger-Array des Typs uchar.

src_array[]

[in]  Quell-Array vom Typ float oder double.

fmt

[in]  Format der Kopie aus der Enumeration ENUM_FLOAT8_FORMAT.

 

Rückgabewert

Gibt bei Erfolg „true“ zurück, andernfalls „false“.

Hinweis

Alle Arten von FP8-Formaten sind in der Enumeration ENUM_FLOAT8_FORMAT definiert und werden in MQL5 nur für Operationen mit ONNX-Modellen verwendet.

Die Funktion konvertiert Eingabeparameter vom Typ float oder double in einen der FP8-Typen. Diese Eingabeparameter werden dann in der Funktion OnnxRun verwendet.

FP8 (8-Bit-floating point) ist einer der Datentypen, die zur Darstellung von Gleitkommazahlen verwendet werden. In FP8 wird jede Zahl durch 8 Datenbits dargestellt, die typischerweise in drei Komponenten unterteilt sind: Vorzeichen, Exponent und Mantisse. Dieses Format bietet ein Gleichgewicht zwischen Genauigkeit und Speichereffizienz und ist daher attraktiv für Anwendungen, die Speicher und Recheneffizienz erfordern.

Durch die Verwendung einer kompakten Zahlendarstellung reduziert FP8 den Speicherbedarf und beschleunigt die Berechnungen. Darüber hinaus kann FP8 für die Implementierung von Operationen auf niedriger Ebene wie arithmetische Berechnungen und Signalverarbeitung nützlich sein.

Beispiel: Die Funktion aus dem Artikel „Arbeiten mit ONNX-Modellen in den Formaten float16 und 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);
  }

Siehe auch

ArrayFromFP8, ArrayCopy