欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

图像缩放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