图像缩放float 乘法
程序员文章站
2022-07-10 18:48:28
在图像缩放处理步骤中,关于图片的缩放前后所选取的坐标精度计算。verilog与c++计算存在的结果不一致情况,就debug完毕后的思路以c++形式写出px为float乘px_i为verilog思路int main(){ for (int i = 1; i <= 8192; ++i){ for(int j = 1; j <= 8192; ++j){ for(int k = 1; k <= j; ++k){...
在图像缩放处理步骤中,关于图片的缩放前后所选取的坐标精度计算。
verilog与c++计算存在的结果不一致情况,就debug完毕后的思路以c++形式写出
px为float乘
px_i为verilog思路
int main(){
for (int i = 1; i <= 8192; ++i){
for(int j = 1; j <= 8192; ++j){
for(int k = 1; k <= j; ++k){
//px
float scale = i / (float) j;
int i_tmp;
memcpy(&i_tmp, &scale, 4);
int i_tmp2 = i_tmp & 0xffffffff;
memcpy(&scale, &i_tmp2, 4);
int px = (int) (scale *(float)k);
if( (scale>128.0) || ( scale < ( 1.0/128 ) ) ){
continue;
}
//px_i
int i_tmp_frac = i_tmp2 & 0x007fffff;
long real_frac = i_tmp_frac | 0x00800000;
int i_tmp_exp = (i_tmp2 & 0x7f800000) >> 23;
int real_exp = i_tmp_exp - 127;
float k_f = (float) k;
memcpy(&i_tmp, &k_f, 4);
int i_tmp_frac_k = i_tmp & 0x007fffff;
long real_frac_k = i_tmp_frac_k | 0x00800000;
int i_tmp_exp_k = (i_tmp & 0x7f800000) >> 23;
int real_exp_k = i_tmp_exp_k - 127;
long long mut_sk = real_frac_k * real_frac;
bool more2 = mut_sk & 0x0000800000000000;
mut_sk = more2? mut_sk : (mut_sk << 1);
bool mut_odd = mut_sk & 0x0000000001000000;
bool mut_half = mut_sk & 0x0000000000800000;
bool more_half= (mut_sk & 0x00000000007fffff);
int add_pre = ( mut_half && (mut_odd || more_half) ) ? 1 : 0;
long long mut_sk_r = (mut_sk & 0x0000ffffff000000) + (add_pre << 24);
int px_i ;
int res_exp = (46 - real_exp - real_exp_k) + (more2 ? 0 : 1);
px_i = mut_sk_r >> res_exp;
if(px_i != px){
cout << endl;
cout << dec << i <<" "<< j << " " << k << " " << scale << " " << px << " " << px_i << endl;
cout << hex << mut_sk << endl;
cout << hex << mut_sk_r << endl;
cout << dec << add_pre << endl;
return 0;
}
}
}
cout << setiosflags(ios::fixed) <<setprecision(2) <<( i / 8192.0 * 100) << "%\r" << flush;
}
}
本文地址:https://blog.csdn.net/qq_15421283/article/details/108852882
上一篇: Java中的强引用和弱引用