ArrayToFP16

float 또는 double 유형의 배열을 주어진 형식으로 ushort 유형의 배열로 복사합니다.

bool   ArrayToFP16(
   const ushort&        dst_array[],        // copy to
   const float&         src_array[],        // copy from
   ENUM_FLOAT16_FORMAT  fmt                 // format
   );

double 유형에 대한 오버로딩

bool   ArrayToFP16(
   const ushort&        dst_array[],        // copy to
   const double&        src_array[],        // copy from
   ENUM_FLOAT16_FORMAT  fmt                 // format
   );

매개 변수

dst_array[]

[out]  수신 배열 또는 ushort 타입.

src_array[]

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

fmt

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

 

반환값

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

참조

FLOAT16 및 BFLOAT16 형식은 ENUM_FLOAT16_FORMAT 열거에 정의되어 있으며 MQL5에서 ONNX 모델을 사용한 작업에만 사용됩니다.

이 함수는 float 또는 double 유형의 입력 매개변수를 FLOAT16 및 BFLOAT16 유형으로 변환합니다. 이러한 입력 매개변수는 OnnxRun 함수에서 사용됩니다.

FLOAT16 은 반정밀도 float라고도 하며 16비트를 사용하여 부동 소수점 숫자를 나타냅니다. 이 형식은 정확성과 계산 효율성 간의 균형을 제공합니다. FLOAT16은 대규모 데이터 세트의 고성능 처리가 필요한 딥러닝 알고리즘과 신경망에 널리 사용됩니다. 이 형식은 숫자의 크기를 줄여 계산을 가속화합니다. 이는 GPU에서 심층 신경망을 훈련할 때 특히 중요합니다.

BFLOAT16(또는 Brain Floating Point 16)도 16비트를 사용하지만 형식 표현 방식에서 FLOAT16과는 다릅니다. 이 형식에서는 8비트가 지수를 표현하기 위해 할당되고 나머지 7비트는 가수를 표현하기 위해 사용됩니다. 이 형식은 딥 러닝 및 인공 지능, 특히 Google의 TPU(Tensor Processor Unit)에 사용하기 위해 개발되었습니다. BFLOAT16은 신경망 훈련에서 뛰어난 성능을 보여주며 계산 속도를 효과적으로 가속화할 수 있습니다.

 

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

//+------------------------------------------------------------------+
//| RunCastFloat16ToDouble                                           |
//+------------------------------------------------------------------+
bool RunCastFloat16ToDouble(long model_handle)
  {
   PrintFormat("test=%s",__FUNCTION__);
   double test_data[12]= {1,2,3,4,5,6,7,8,9,10,11,12};
   ushort data_uint16[12];
   if(!ArrayToFP16(data_uint16,test_data,FLOAT_FP16))
     {
      Print("error in ArrayToFP16. error code=",GetLastError());
      return(false);
     }
   Print("test array:");
   ArrayPrint(test_data);
   Print("ArrayToFP16:");
   ArrayPrint(data_uint16);
   U<ushortinput_float16_values[3*4];
   U<doubleoutput_double_values[3*4];
   float test_data_float[];
   if(!ArrayFromFP16(test_data_float,data_uint16,FLOAT_FP16))
     {
      Print("error in ArrayFromFP16. error code=",GetLastError());
      return(false);
     }
   for(int i=0i<12i++)
     {
      input_float16_values[i].value=data_uint16[i];
      PrintFormat("%d input value =%f  Hex float16 = %s  ushort value=%d",i,test_data_float[i],ArrayToString(input_float16_values[i].uc),input_float16_values[i].value);
     }
   Print("ONNX input array:");
   ArrayPrint(input_float16_values);
   bool res=OnnxRun(model_handle,ONNX_NO_CONVERSION,input_float16_values,output_double_values);
   if(!res)
     {
      PrintFormat("error in OnnxRun. error code=%d",GetLastError());
      return(false);
     }
   Print("ONNX output array:");
   ArrayPrint(output_double_values);
//---
   double sum_error=0.0;
   for(int i=0i<12i++)
     {
      double delta=test_data[i]-output_double_values[i].value;
      sum_error+=MathAbs(delta);
      PrintFormat("%d output double %f = %s  difference=%f",i,output_double_values[i].value,ArrayToString(output_double_values[i].uc),delta);
     }
//---
   PrintFormat("test=%s   sum_error=%f",__FUNCTION__,sum_error);
//---
   return(true);
  }

참조

ArrayFromFP16, ArrayCopy