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ビット浮動小数点)は、浮動小数点数を表すために使用されるデータ型の1つです。FP8では、各数値は8データビットで表され、通常は符号、指数、仮数の3つの要素に分割されます。この形式は精度とストレージ効率のバランスが取れているため、メモリと計算効率を必要とするアプリケーションにとって魅力的です。

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<uchar> input_float8_values[3*5];
  U<float> output_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=0; i<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=0; i<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);
 }

参照

ArrayFromFP8ArrayCopy