ArrayToFP16

Производит копирование массива типа float или double в массив типа ushort с заданным форматом.

bool   ArrayToFP16(
   const ushort&        dst_array[],        // куда копируем
   const float&         src_array[],        // откуда копируем
   ENUM_FLOAT16_FORMAT  fmt                 // формат
   );

Перегрузка для типа double

bool   ArrayToFP16(
   const ushort&        dst_array[],        // куда копируем
   const double&        src_array[],        // откуда копируем
   ENUM_FLOAT16_FORMAT  fmt                 // формат
   );

Параметры

dst_array[]

[out]  Массив-приемник типа ushort.

src_array[]

[in]  Массив-источник типа float или double.

fmt

[in]  Формат копирования из перечисления ENUM_FLOAT16_FORMAT.

 

Возвращаемое значение

Возвращает true в случае успеха, иначе false.

Примечание

Форматы FLOAT16 и BFLOAT16 определены в перечислении ENUM_FLOAT16_FORMAT и используются в MQL5 исключительно только для работы с ONNX моделями.

Функция используется для преобразования входных параметров типа float или doulbe в тип FLOAT16 и BFLOAT16. Далее эти входные параметры используются в функции OnnxRun.

FLOAT16, также известный как половинная точность или формат "half-precision float", использует 16 бит для представления числа с плавающей точкой. Этот формат обеспечивает баланс между точностью и эффективностью вычислений. FLOAT16 широко применяется в глубоком обучении и нейронных сетях, где требуется высокая производительность при обработке больших объемов данных. Этот формат позволяет ускорить вычисления за счет сокращения размера чисел, что особенно важно при обучении глубоких нейронных сетей на графических процессорах (GPU).

BFLOAT16 (или Brain Floating Point 16) также использует 16 бит, но он различается от FLOAT16 в способе представления чисел. В этом формате 8 бит выделены для представления экспоненты, а оставшиеся 7 бит используются для представления мантиссы. Этот формат был разработан для использования в глубоком обучении и искусственном интеллекте, особенно в процессорах Google Tensor Processing Unit (TPU). BFLOAT16 обладает хорошей производительностью при обучении нейронных сетей и может быть эффективно использован для ускорения вычислений.

 

Пример: функция из статьи Работа с ONNX-моделями в форматах float16 и float8

//+------------------------------------------------------------------+
//| 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