ArrayToFP8

float 또는 double 유형의 배열을 지정된 형식으로 uchar 유형의 배열로 복사합니다.

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

double 유형에 대한 오버로딩

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

매개 변수

dst_array[]

[out]  uchar 유형의 수신 배열.

src_array[]

[in]  float 또는 double 유형의 소스 배열.

fmt

[in] ENUM_FLOAT8_FORMAT 열거에서 형식을 복사.

 

반환값

성공하면 true를, 그렇지 않으면 false를 반환.

참조

모든 종류의 FP8 형식은 ENUM_FLOAT8_FORMAT 열거에 정의되어 있으며 MQL5에서 ONNX 모델과의 작업에만 사용됩니다.

이 함수는 float 또는 double 유형의 입력 매개변수를 FP8 유형 중 하나로 변환합니다. 이러한 입력 매개변수는 OnnxRun 함수에서 사용됩니다.

FP8(8비트 부동 소수점)은 부동 소수점 자리를 나타내는 데 사용되는 데이터 유형 중 하나입니다. FP8에서 각 숫자는 8개의 데이터 비트로 표시되며 일반적으로 부호, 지수 및 가수의 세 가지 구성 요소로 나뉩니다. 이 형식은 정확성과 저장 효율성 사이의 균형을 제공하므로 메모리 용량과 계산 효율성이 필요한 애플리케이션에 적합합니다.

FP8은 간결한 숫자 표현을 사용하여 메모리의 양을 줄이고 계산을 가속화합니다. 또한 FP8은 산술 계산 및 신호 처리와 같은 로 레벨의 작업을 구현하는 데 유용할 수 있습니다.

예: 다음 기사의 함수 float16 및 float8 형식으로 ONNX 모델 작업

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

참조

ArrayFromFP8, ArrayCopy