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 ; }
unsigned short divide(unsigned short a, unsigned short b) { float op1 = half2float(a); float op2 = half2float(b); return float2half(op1 / op2); }
unsigned short multiply(unsigned short a, unsigned short b) { float op1 = half2float(a); float op2 = half2float(b); return float2half(op1 * op2); }
unsigned short subtract(unsigned short a, unsigned short b) { float op1 = half2float(a); float op2 = half2float(b); return float2half(op1 - op2); }
unsigned short add(unsigned short a, unsigned short b) { float op1 = half2float(a); float op2 = half2float(b); return float2half(op1 + op2); }