ArrayToFP8

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

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

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

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

Parametreler

dst_array[]

[out]  uchar türünde alıcı dizi.

src_array[]

[in]  float veya double 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.

Fonksiyon, float veya double türündeki girdi parametrelerini FP8 türlerinden birine dönüştürür. Bu girdi parametreleri daha sonra OnnxRun fonksiyonunda kullanılır.

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

ArrayFromFP8, ArrayCopy