ArrayFromFP16
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,也称为半精度float(浮点),使用16位来表示浮点数。这种格式提供了准确性和计算效率之间的平衡。FLOAT16广泛应用于需要对大型数据集进行高性能处理的深度学习算法和神经网络。这种格式通过减少数字大小来加速计算,这在GPU上训练深度神经网络时尤其重要。
BFLOAT16(或Brain Floating Point 16)也使用16位,但在格式表示方法上与FLOAT16不同。在该格式中,分配8位用于表示指数,而剩余7位用于表示尾数。这种格式是为深度学习和人工智能而开发的,特别是在谷歌的张量处理单元(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);
}