рд╕реА ++ рдореЗрдВ рдлрд┐рдХреНрд╕реНрдб-рдкреЙрдЗрдВрдЯ рдЕрдВрдХрдЧрдгрд┐рдд

рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд-рдмрд┐рдВрджреБ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдирдВрдмрд░ рдкрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЦрд╝рд░рд╛рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдпреВ рдХреЛ рддреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдПрдлрдкреАрдпреВ (рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдпреВрдирд┐рдЯ) рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░рд┐рдорд╛рдг рдзреАрдореА рдХреЗ рдПрдХ рдХреНрд░рдо рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╣реИрдВ рдЬрд╣рд╛рдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдПрдлрдкреАрдпреВ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХрд░рдг рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдлрдкреАрдпреВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЧреБрдгрди рдХреЗрд╡рд▓ рдПрдХ fmul рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ FPU рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, __mulsf3 рдЕрдиреБрдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Fmul рдХрдорд╛рдВрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, __mulsf3 рдлрд╝рдВрдХреНрд╢рди рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЧрдгрдирд╛ рдкреВрд░реНрдгрд╛рдВрдХ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп, рдЬрдмрдХрд┐ fmul рдХрдорд╛рдВрдб рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдзрдиред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдПрди рдмрд┐рдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЦреНрдпрд╛ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд╛рд░реА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдВрд╢ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рдж 2 ^ рдПрди рдХреА рд╕рдЯреАрдХрддрд╛ рд╣реЛрдЧреАред 8 рдмрд┐рдЯреНрд╕ (2 ^ 8 = 1024) рдХреЗ рдХреНрд░рдо рдХреЗ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред

рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

Fixed(12345,6789) = 1024 * 12345,6789 = 12641975,<s>1936</s> 

рдпрд╣ рд╕рдВрдЦреНрдпрд╛, рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рдж, рджрд╢рдорд▓рд╡ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рдж 2 ^ 8 рдХреА рд╕рдЯреАрдХрддрд╛ рд╣реИред

рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд-рдмрд┐рдВрджреБ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред

 Float(12641975) = 12641975 / 1024 = 12345,678<s>7109375</s> 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рд┐рд╡рд░реНрд╕ рдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди рдХреЗ рдмрд╛рдж рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдлреЙрд░реНрдо 12345.6787109375 рд╣реИ рдФрд░ рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рдж рд╕рдЯреАрдХ 3 рдЕрдВрдХ рд╣реИ, рдЕрдзрд┐рдХрддрдо рд╕рдЯреАрдХрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 2 ^ 8 = 1024 рд╣реИред

рдирд┐рд╢реНрдЪрд┐рдд-рдмрд┐рдВрджреБ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЧрдгрдирд╛ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИ?


рд╕рдо рдФрд░ рдЕрдВрддрд░ рдСрдкрд░реЗрд╢рди рд╕рд╛рдзрд╛рд░рдг рдкреВрд░реНрдгрд╛рдВрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреЗ рд╣реИрдВред

Fixed(x) + Fixed(y) Fixed(x) - Fixed(y) , рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ
(1024 * x) + (1024 * y) (1024 * x) - (1024 * y)

рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЧреБрдгрди рдЗрд╕ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
(Fixed(x) * Fixed(y)) / p , рдпрд╣ рдмрд░рд╛рдмрд░ рд╣реИ, 8 рдмрд┐рдЯреНрд╕ рдХреЗ рдПрдХ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде
((1024 * x) * (1024 * y)) / 1024

рдкреНрд░рднрд╛рдЧред
(Fixed(x) * p) / Fixed(y) , 8 рдмрд┐рдЯреНрд╕ рдХреЗ рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде рднреА, рдпрд╣
(1024 * 1024 * x)*(1024 * y)

рдмрд╛рдврд╝


рдЧреБрдгрди рдФрд░ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╕рдордп, рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдПрдХ рдорд╛рдорд▓рд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬреЛ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред рдпрд╣ рддрдм рд╣реЛрдЧрд╛ рдЬрдм рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 32-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрдЦреНрдпрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдЦреЛ рджреЗрдЧреАред рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:

  • 64-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЧрдгрдирд╛ рдХрд░реЗрдВред
  • "рдЕрд╕рдВрддреБрд╖реНрдЯ" рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЧреБрдгрд╛, (xi + xf) * (yi + yf) = xi * yi + xf * yf + xi * yf + yi / xf, рдЙрдкрд╕рд░реНрдЧ i рдФрд░ f рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреВрд░рд╛ рднрд╛рдЧ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХрд╛ рднрд╛рдЧред рдмрд┐рдВрджреБред

C ++ рдореЗрдВ рдлрд┐рдХреНрд╕реНрдб-рдкреЙрдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕


 #define DIGITS 1024 //  #define EPS 20 //       using namespace std; typedef signed int __int32_t; class Fixed { signed int x; Fixed(signed int a){ x = a; } public: Fixed(){ x = 0; } static Fixed fromInt(signed int val){ return Fixed(val*DIGITS); } static Fixed fromFloat(float val){ return Fixed((signed int)(val*DIGITS)); } float fixed2float(){ return ((float)x)/DIGITS; } Fixed sum(Fixed a,Fixed b){ return Fixed(a.x+bx); } Fixed diff(Fixed a,Fixed b){ return Fixed(ax-bx); } Fixed mul(Fixed a,Fixed b){ signed int c=ax*bx; if(c/bx != ax){ // Overflow! signed int i1 = ax/DIGITS; signed int i2 = bx/DIGITS; signed int f1 = (ax&(DIGITS-1)); signed int f2 = (bx&(DIGITS-1)); return Fixed((i1*i2)*DIGITS+(f1*f2)/DIGITS+i1*f2+i2*f1); }else{ return Fixed(c/DIGITS); } } Fixed div(Fixed a,Fixed b){ if(ax>(1<<21)){ // Overflow! signed int i = ax/DIGITS; signed int f = (ax&(DIGITS-1)); return Fixed(((i*DIGITS)/bx)*DIGITS+(f*DIGITS)/bx); }else{ return Fixed((ax*DIGITS)/bx); } } Fixed sqrt(Fixed k){ Fixed tmp(0); tmp.x = kx/2; signed int min = 0; signed int max = kx; Fixed quick(0); do{ tmp.x = (min+max)/2; quick = Fixed::mul(tmp,tmp); if(abs(quick.xk.x)<EPS) return Fixed(tmp); if(quick.x>kx){ max = tmp.x; }else{ min = tmp.x; } }while(true); } }; 

Source: https://habr.com/ru/post/hi451922/


All Articles