ArrayFromFP8

uchar türündeki bir diziyi istenilen formatta float veya double türünde bir diziye kopyalar.

bool   ArrayFromFP8(
   const float&         dst_array[],        // hedef dizi
   const uchar&         src_array[],        // kaynak dizi
   ENUM_FLOAT8_FORMAT   fmt                 // format
   );

Double türü için aşırı yükleme

bool   ArrayFromFP8(
   const double&        dst_array[],        // hedef dizi
   const uchar&         src_array[],        // kaynak dizi
   ENUM_FLOAT8_FORMAT   fmt                 // format
   );

Parametreler

dst_array[]

[out]  float veya double türünde alıcı dizi.

src_array[]

[in]  uchar türünde kaynak dizi.

fmt

[in] ENUM_FLOAT8_FORMAT numaralandırmasından kopyalama formatı.

 

Geri dönüş değeri

Başarılı ise true, aksi takdirde false geri döndürür.

Not

Tüm FP8 format türleri ENUM_FLOAT8_FORMAT numaralandırmasında tanımlanır ve MQL5'te yalnızca ONNX modelleriyle yapılan çalışmalar için kullanılır.

OnnxRun fonksiyonunun yürütülmesinden elde edilen çıktı parametreleri ENUM_FLOAT8_FORMAT numaralandırmasından FP8 türündeyse, sonucu float veya double türünde dizilere dönüştürmek için bu fonksiyonu kullanabilirsiniz.

FP8 (8-bit floating point), ondalıklı sayıları temsil etmek için kullanılan veri türlerinden biridir. FP8'de her sayı 8 veri biti ile temsil edilir ve tipik olarak üç bileşene ayrılır: işaret, üs ve mantis. Bu format, doğruluk ve depolama verimliliği arasında bir denge sunarak bellek ve hesaplama verimliliği gerektiren uygulamalar için ideal hale gelir.

FP8, kompakt sayı temsili kullanarak bellek gereksinimlerini azaltır ve hesaplamaları hızlandırır. Buna ek olarak, FP8 aritmetik hesaplamalar ve sinyal işleme gibi düşük seviyeli işlemleri uygulamak için de faydalı olabilir.

Örnek: makaleden fonksiyon - ONNX modelleriyle float16 ve float8 formatlarında çalışma

//+------------------------------------------------------------------+
//| 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);
  }

Ayrıca bakınız

ArrayToFP8, ArrayCopy