示例#1
0
void check_precision_error( float value )
{
    float original = value;
    float converted1 = half2float(float2half(value));

    if( std::abs(original-converted1) > 0 )
        std::cout << "Precision warning: " << value << " (" << (original-converted1 > 0 ? "+" : "") << (original-converted1) << " err)" << std::endl;
    else ;// value ok;

    float converted2 = float16(value);
    assert( converted1 == converted2 );
}
void convertUchar2Fp16(const cv::Mat src, cv::Mat &dstFloat, cv::Mat &dstHalf)
{
	dstFloat = cv::Mat(src.rows, src.cols, CV_32F);
	dstHalf  = cv::Mat(src.rows, src.cols, CV_16S);
	float* floatPointer = (float*)dstFloat.data;
	short* halfPointer  = (short*)dstHalf.data;
	for (int y = 0; y < src.rows; y++)
	{
	for (int x = 0; x < src.cols; x++)
	{
		unsigned int index = y*src.cols+x;
		floatPointer[index] = (float)(src.data[index]/cHigh);
	}
	}
	float2half(floatPointer, halfPointer, src.cols*src.rows);
	return ;

}
示例#3
0
unsigned short divide(unsigned short a, unsigned short b) {
  float op1 = half2float(a);
  float op2 = half2float(b);
  return float2half(op1 / op2);
}
示例#4
0
unsigned short multiply(unsigned short a, unsigned short b) {
  float op1 = half2float(a);
  float op2 = half2float(b);
  return float2half(op1 * op2);
}
示例#5
0
unsigned short subtract(unsigned short a, unsigned short b) {
  float op1 = half2float(a);
  float op2 = half2float(b);
  return float2half(op1 - op2);
}
示例#6
0
unsigned short add(unsigned short a, unsigned short b) {
  float op1 = half2float(a);
  float op2 = half2float(b);
  return float2half(op1 + op2);
}