ArrayFromFP16

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

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

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

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

Параметры

dst_array[]

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

src_array[]

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

fmt

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

 

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

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

Примечание

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

Если выходные параметры, полученные при выполнении функции OnnxRun, являются типом FLOAT16 и BFLOAT16, то данная функция позволяет конвертировать результат в массивы типа float или double.

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

Смотри также

ArrayToFP16, ArrayCopy