рд╣рдо рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рд╕рдВрдЦреНрдпрд╛ рдИ рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ

рд╕реНрдХреЙрдЯ рдореЗрдпрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ "рд╕реА + рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдЙрдкрдпреЛрдЧ" рдкреБрд╕реНрддрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬреЛ (рдФрд░ рдореИрдВ рдХрд┐рд╕реА рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛) рд╕рднреА рдкреНрд░рд╢рдВрд╕рд╛ рдХреЗ рдпреЛрдЧреНрдп рд╣реВрдВ, рдореБрдЭреЗ рдмрд╣реБрдд рдЫреБрдЖ рдЧрдпрд╛ рдерд╛, рдлрд┐рд░ рдХрд┐рд╕ рдЙрддреНрд╕рд╛рд╣, рдкреНрд░реЗрд░рдгрд╛, рдЙрддреНрд╕рд╛рд╣ рдХреЗ рд╕рд╛рде (рд╢рд╛рдпрдж рдпрд╣ рдореБрдЭреЗ рдкреНрд░рддреАрдд рд╣реБрдЖ?) рд▓реЗрдЦрдХ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рдЙрдирдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рддреБрдореНрд╣реЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЯреБрдХрдбрд╝рд╛ рджреЗ рджреЛ:

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ ( TMP ) рд╕рдВрдХрд▓рди-рдЖрдзрд╛рд░рд┐рдд C тАЛтАЛ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ: рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдо C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдЪрд▓рддрд╛ рд╣реИ ...
рдпрд╣ рд╕рд╛рдмрд┐рдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ рдХрд┐ рдЯреАрдПрдордкреА рддрдХрдиреАрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯреНрдпреВрд░рд┐рдВрдЧ рдорд╢реАрди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╢рдХреНрддрд┐ рд╣реИ ...


рд╣рд╛рдБ ... рдореЗрд░рд╛ рджрд┐рд▓ рдзрдбрд╝рдХ рд░рд╣рд╛ рдерд╛, рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдерд╛ - рдмрд╕ рд╕реЛрдЪреЛ - рд╕рднреА рдЖрдЧрд╛рдореА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдЯреНрдпреВрд░рд┐рдВрдЧ рдорд╢реАрди ... рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдмрд╕ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ ... рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ ...

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдорд╣рд╛рди рдЕрд╡рд╕рд░реЛрдВ рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХрд╛рд░рдирд╛рдореЛрдВ рдХреА рджреБрдирд┐рдпрд╛ рдХреЗ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП - рдЖрдЗрдП рд╣рдо рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХреБрдЦреНрдпрд╛рдд рдирдВрдмрд░ рдИ рдХрд╛ рдорд╛рдиред

рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ (рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде) - рдЯреЗрд▓рд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ , рдпрд╛ рдмрд▓реНрдХрд┐ рдореИрдХрд▓реЙрд░рд┐рди рд╢реНрд░реГрдВрдЦрд▓рд╛ , рдЖрдкрдХреЛ рдмрддрд╛рдПрдЧреА:


рдпрд╛рдиреА рд╣рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рднрд╛рдЬреНрдп рдХреЛ рдкрдврд╝рдиреЗ, рдПрдХ рд╢рдХреНрддрд┐ рдХреЛ рдмрдврд╝рд╛рдиреЗ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдФрд░ рднрд┐рдиреНрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ... рдФрд░ рдпрд╣ рд╕рдм C ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреА рдорджрдж рд╕реЗред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рднрд┐рдиреНрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ - рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдВрд╢ рдФрд░ рд╣рд░ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ ( рдПрди - рдиреНрдпреВрдореЗрд░рд┐рдпрд░, рдбреА - рдбреЗрдиреЛрдорд┐рдиреЗрдЯрд░):
template<int n, int d> struct Fractional { enum { N = n, D = d }; }; 

рдпрд╣ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реВрдиреНрдп рд╣рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЖрдЗрдпреЗ рдЗрд╕реЗ рдЖрдЬрдорд╛рддреЗ рд╣реИрдВ:
 template<int n, int d> struct Fractional { private: enum { NonZeroDenominator = n / d }; public: enum { N = n, D = d }; }; 

рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 typedef Fractional<9, 0> number; // ... int temp = number::D; 

Msvc10 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ error C2057: expected constant expression C2057 рдЬреИрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ error C2057: expected constant expression рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ NonZeroDenominator рдЪрд░ рджреЗрдЦреЗрдВрдЧреЗ - рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ ...

рддреЛ, рд╣рдо 2 рдирдВрдмрд░ рдмрдЪрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рд▓реЗрдХрд┐рди рднрд┐рдиреНрдиреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рдирдВрдмрд░реЛрдВ рдХреЗ gcd (рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рднрд╛рдЬрдХ) рдХреЛ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП - рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ:
 int gcd(int a, int b) { if(b == 0) return a; return gcd(b, a % b); } 

рдЬреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:
 template<int n1, int n2> struct GCD { enum { value = GCD<n2, n1 % n2>::value }; }; template<int n1> struct GCD<n1, 0> { enum { value = n1 }; }; 

рдпрд╣ рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛? - рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рджреВрд╕рд░реА рд╕рдВрдЦреНрдпрд╛ рд╢реВрдиреНрдп рд╣реИ - рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ)ред
рдКрдкрд░ рд▓рд┐рдЦреА рд╣рд░ рдЪреАрдЬ рдХреА рдорджрдж рд╕реЗ рд╣рдо рднрд┐рдиреНрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ:
 template<int n, int d> struct Fractional { private: enum { NonZeroDenominator = n / d }; enum { gcd = GCD<n, d>::value }; public: enum { N = n / gcd, D = d / gcd }; }; 

рдЬрд╛рдиреЗ-рдорд╛рдиреЗ рдлрд╝рд╛рд░реНрдореБрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ - рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛, рдЧреБрдгрд╛ рдХрд░рдирд╛, рдШрдЯрд╛рдирд╛, рд╣рдорд╛рд░реА рд╕рдВрдЦреНрдпрд╛рдПрдБ рдЬреЛрдбрд╝рдирд╛:
 // // Divide // template<typename n, typename d> struct Divide { }; template<int n1, int d1, int n2, int d2> struct Divide<Fractional<n1, d1>, Fractional<n2, d2> > { private: typedef Fractional<n1, d1> n; typedef Fractional<n2, d2> d; public: typedef Fractional<n::N * d::D, n::D * d::N> value; }; // // Multiple // template<typename n, typename d> struct Multiple { }; template<int n1, int d1, int n2, int d2> struct Multiple<Fractional<n1, d1>, Fractional<n2, d2> > { private: typedef Fractional<n1, d1> n; typedef Fractional<n2, d2> d; public: typedef Fractional<n::N * d::N, n::D * d::D> value; }; // // Substract // template<typename n, typename d> struct Substract { }; template<int n1, int d1, int n2, int d2> struct Substract<Fractional<n1, d1>, Fractional<n2, d2> > { private: typedef Fractional<n1, d1> n; typedef Fractional<n2, d2> d; public: typedef Fractional<n::N * d::D - d::N * n::D, n::D * d::D> value; }; // // Add // template<typename n, typename d> struct Add { }; template<int n1, int d1, int n2, int d2> struct Add<Fractional<n1, d1>, Fractional<n2, d2> > { private: typedef Fractional<n1, d1> n; typedef Fractional<n2, d2> d; public: typedef Fractional<n::N * d::D + d::N * n::D, n::D * d::D> value; }; 

рдлрд┐рд░ рд╕реЗ - рд╣рдо рдЕрдкрдиреЗ " рдлрд╝рдВрдХреНрд╢рди " рдХрд╛ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдХреЗрдЪ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Divide - рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ (рдлрд╝рдВрдХреНрд╢рди) 2 рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдПрдХ рдЖрдВрд╢рд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдорджрдж рд╕реЗ, рд╣рдо рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреБрдЫ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Divide<n1, n2> ред рдЙрдкрдпреЛрдЧ :
  typedef Fractional<4, 20> n1; typedef Fractional<5, 32> n2; typedef Add<n1, n2>::value summ; printf("%i/%i\n", summ::N, summ::D); // 57/160 


рд╣рдореЗрдВ рдШрд╛рддрд╛рдВрдХ рдФрд░ рднрд╛рдЬреНрдп рдХреА рднреА рдЬрд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддреА рд╣реИ:
 // // Factorial // template<int N> struct Factorial { enum { value = N * Factorial<N - 1>::value }; }; template<> struct Factorial<0> { enum { value = 1 }; }; // // Power // template<int x, int n> struct Pow { enum { value = x * Pow<x, n - 1>::value }; }; template<int x> struct Pow<x, 0> { enum { value = 1 }; }; 

рдЗрд╕рд▓рд┐рдП, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдкреВрд░рд╛ рд╕реЗрдЯ рд╣реИ - рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо рдЕрд╕реАрдо рд░реВрдк рд╕реЗ рд╕рд╛рд░рд╛рдВрд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдХрд┐рддрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕рдкреНрд░реЗрд╢рди Exp<4, 8>::value рдПрдХ рднрд┐рдиреНрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рджреЗрдЧрд╛ рдЬреЛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ 4 рд╡реЗрдВ рдЕрдВрд╢ рдореЗрдВ рдШрд╛рддрд╛рдВрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ рдФрд░ рд╕рдорд╛рд╡реЗрд╢реА рд╢рдмреНрдж рдХреЗ рдХреЗрд╡рд▓ 8 (рдЕрдирдВрдд рдкрд╛рд╕) рддрдХ рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рднрд┐рдиреНрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рднреА рдирд╣реАрдВ рд╣реИрдВ - рдпреЗ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ ! рд╣рд╛рдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЗрд╕ рддрдереНрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рд╣рдо рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рд╕реЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдбреЗрдЯрд╛ (рдФрд░ рдЯрд╛рдЗрдкрдбреЗрдлрд╝реНрд╕ - рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд┐рд▓рдХреБрд▓ рд╕рд╣реА! - рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдпреЛрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдЧрд╛ ... рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди infinitumред
рдХреЛрдб рдХрд╛ рдЯреБрдХрдбрд╝рд╛:
 // // Exponent // template<int x, int n> struct Exp : public Exp<x, n - 1> { private: typedef typename Exp<x, n - 1>::value previous; protected: typedef Fractional<Pow<x, n>::value, Factorial<n>::value> current; public: typedef typename Add<current, previous>::value value; }; template<int x> struct Exp<x, 0> { public: typedef Fractional<Pow<x, 0>::value, Factorial<0>::value> current; public: typedef current value; }; 


current рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдХрд╛ рдорд╛рди рд╣реИ - рдЕрд░реНрдерд╛рдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЗрд╕ рдкреВрд░реЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ, рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдмреЛрд▓рдирд╛, рдПрдХ рд╕рджрд╕реНрдп рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд╡рд╣ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдбреЗрдЯрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рджрд╕реНрдп рдХрд╛ рдореВрд▓реНрдп - рдпрд╣ рд╕рдм рд╣рдореЗрдВ рдпрд╣ рддрдереНрдп рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдПрдХ рдЕрд▓рдЧ рддрддреНрд╡ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд░реНрддрдорд╛рди рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрддреНрд╡ (рд╡рд░реНрдЧ) рддрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдпреЛрдЧ рд╕рдореНрдорд┐рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЧрд░реНрд╡ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 int main() { //  typedef Exp<1, 8>::value result; printf("%i/%i\n", result::N, result::D); //   printf("%f\n", result::N / static_cast<float>(result::D)); } 

32 рдмрд┐рдЯ рдорд╢реАрди рдкрд░, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ 8 рд╕реЗ рдЕрдзрд┐рдХ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - int рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ред

рдкрд░рд┐рдгрд╛рдо : 2.718279 (109601/40320)ред

рдЬрд╛рджреВ :)
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдкреБрдирд╢реНрдЪ: рдореИрдВ рд╡рд░реНрддрдиреА, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдореИрдВ рдПрдХ рдиреАрдВрдж рдХреА рд╡рд┐рдлрд▓рддрд╛, рдШрдмрд░рд╛рд╣рдЯ рдФрд░ рдЦреБрд╢реА рдореЗрдВ рдерд╛ред

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


All Articles