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は半精度浮動小数点数とも呼ばれ、16ビットを使用して浮動小数点数を表します。この形式では、精度と計算効率のバランスが提供されます。FLOAT16は、大規模なデータセットの高性能処理を必要とする深層学習アルゴリズムやニューラルネットワークで広く使用されています。この形式は、数値のサイズを小さくすることで計算を高速化します。これは、GPUでディープニューラルネットワークを訓練する場合に特に重要です。

BFLOAT16(またはBrain Floating Point 16)も16 ビットを使用しますが、形式表現のアプローチがFLOAT16とは異なります。この形式では、8ビットが指数を表すために割り当てられ、残りの7ビットが仮数を表すために使用されます。この形式は、深層学習と人工知能、特にGoogleのTensor Processing Unit (TPU)で使用するために開発されました。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<ushort> input_float16_values[3*4];
  U<double> output_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=0; i<12; i++)
    {
    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=0; i<12; i++)
    {
    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);
 }

参照

ArrayFromFP16ArrayCopy