ArrayFromFP8

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

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

Überladung für den Typ double

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

Parameter

dst_array[]

[out]  Empfänger-Array des Typs float oder double.

src_array[]

[in]  Quellarray vom Typ uchar.

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.

Wenn die aus der Ausführung der Funktion OnnxRun erhaltenen Ausgabeparameter FP8 aus der Enumeration ENUM_FLOAT8_FORMAT sind, können Sie diese Funktion verwenden, um das Ergebnis in Float- oder Double-Arrays umzuwandeln.

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

ArrayToFP8, ArrayCopy