рдкрд╛рдпрдерди рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ?

рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред





рдЬрдм рдЖрдк рд╕реА рдЬреИрд╕реА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХреНрд╡рд╛рд▓реАрдлрд╛рдпрд░ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рдЖрдк рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмрд╕ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ intрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ longрдпрд╛ рдирд╣реАрдВ long doubleред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрди "рдорд╛рдореВрд▓реА" рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдпрдерди integerрдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред

рд╕реА рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 2 20000 рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ powlрдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓реЗрдЧрд╛ infред

#include <stdio.h>
#include <math.h>

int main(void) {
  printf("%Lf\n", powl(2, 20000));
  return 0;
}

$ ./a.out
inf

рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ:

>>> 2 ** 20000
39802768403379665923543072061912024537047727804924259387134 ...
...
... 6021 digits long ...
...
6309376

рдпрд╣ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд╛рдпрдерди рдмрд╣реБрдд рд╕реБрдВрджрд░ рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЖрдЬ рд╣рдо рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрд╣ рдордирдорд╛рдиреЗ рдЖрдХрд╛рд░ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдкреНрд░рд╕реНрддреБрддрд┐ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛


Integer рдкрд╛рдпрдерди рдореЗрдВ, рдпрд╣ рдПрдХ рд╕реА рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

struct _longobject {
    PyObject_VAR_HEAD
    digit ob_digit[1];
};

PyObject_VAR_HEADрдПрдХ рдореИрдХреНрд░реЛ рд╣реИ, рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИ PyVarObject, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ:

typedef struct {
    PyObject ob_base;
    Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;

рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ PyObject_VAR_HEAD:

  • PyBytesObject
  • PyTupleObject
  • PyListObject

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдЯреНрдпреВрд▓ рдпрд╛ рд╕реВрдЪреА, рдХреА рдПрдХ рдЪрд░ рд▓рдВрдмрд╛рдИ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдХрджрдо рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рд╡рд┐рд╢рд╛рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдХреНрд░реЛ _longobjectрдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

struct _longobject {
    PyObject ob_base;
    Py_ssize_t ob_size; /* Number of items in variable part */
    digit ob_digit[1];
};

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ PyObjectрдХреБрдЫ рдореЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА (рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣) рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдкрд░ рд╣рдо рдЗрд╕ ob_digitрдФрд░ рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ ob_sizeред

рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди ob_digit


ob_digitрдкреНрд░рдХрд╛рд░ рдХреА рдЗрдХрд╛рдИ рд▓рдВрдмрд╛рдИ рдХрд╛ рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕рд░рдгреА рд╣реИ digit (typedef uint32_t)ред рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд░рдгреА рд╣реИ, рдпрд╣ ob_digitрдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдореЙрд▓реЛрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд▓рдВрдмрд╛рдИ рдореЗрдВ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдЬрдЧрд░ рдмрд╣реБрдд рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЖрдорддреМрд░ рдкрд░, рд╕реА рдЬреИрд╕реА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ 64 рдмрд┐рдЯреНрд╕ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд╛рдпрдерди рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ ред рдкрд╛рдпрдерди 3 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рд╕рднреА рдирдВрдмрд░ рдлреЙрд░реНрдо рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП bignumрдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЙрдкрд▓рдмреНрдз рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди ob_size


ob_sizeрдореЗрдВ рдорджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ ob_digitред рдкрд╛рдпрдерди рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ ob_sizeрд╕рд░рдгреА рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рджрдХреНрд╖рддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдореЗрдВ рдирд┐рд╣рд┐рдд рддрддреНрд╡реЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ob_digitред

рднрдВрдбрд╛рд░рдг


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

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, 5238 рдирдВрдмрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛:



рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдХреНрд╖рдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рджрд╢рдорд▓рд╡ рдЕрдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 32-рдмрд┐рдЯ рдЕрдВрдХ (uint32_t) рддрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, 0 рд╕реЗ 9 рддрдХ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ 4 рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдЕрдЬрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдореБрдЦреА рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд░реНрдиреЗрд▓ рдбреЗрд╡рд▓рдкрд░ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЖрд╡рд┐рд╖реНрдХрд╛рд░рд╢реАрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рддреЛ, рдХреНрдпрд╛ рд╣рдо рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдмреЗрд╢рдХ, рдЕрдиреНрдпрдерд╛ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ред рдЖрдЗрдП рдЗрд╕ рдмрд╛рдд рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдХрд┐ рдкрд╛рдпрдерди рдЕрддрд┐рд░рд┐рдХреНрдд-рд▓рдВрдмреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

рдЕрдЬрдЧрд░ рдХрд╛ рд░рд╛рд╕реНрддрд╛


рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рджрд╢рдорд▓рд╡ рдЕрдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп ob_digit, рдкрд╛рдпрдерди рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ 10 рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ 2 30 рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдорд╛рди 0 рд╕реЗ 2 30 - 1 рддрдХ рд╣реЛрддрд╛ рд╣реИред

рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ, рдмреЗрд╕ 16 ~ 2 4 рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ "рдЕрдВрдХ" рджрд╢рдорд▓рд╡ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ 0 рд╕реЗ 15 рддрдХ рд╣реЛрддрд╛ рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ, рдЗрд╕реА рддрд░рд╣, 2 30 рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ "рд╕рдВрдЦреНрдпрд╛" , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рджрд╢рдорд▓рд╡ рдореЗрдВ 0 рд╕реЗ 2 30 - 1 = 1073741823 рддрдХ рднрд┐рдиреНрди рд╣реЛрдЧреА ред

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

рдордВрдЪ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкрд╛рдпрдерди 32-рдмрд┐рдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдпрд╛ 16-рдмрд┐рдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ 15-рдмрд┐рдЯ рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдмрд┐рдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЙрджрд╛рд╣рд░рдг: 1152921504606846976

рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЖрдзрд╛рд░ 2 30 рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрджрд┐ рдЖрдк 1152921504606846976 рдХреЛ 2 30 рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдзрд╛рд░ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдЖрдк 100.

1152921504606846976 = 1 * (2 30)) 2 + 0 * (2 30 ) 1 + 0 * (2 30 ) 0

рдЪреВрдВрдХрд┐ ob_digitрдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрдХ рдкрд╣рд▓реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ 001 рдХреЛ рддреАрди рдЕрдВрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рди рдХреЗ рд▓рд┐рдП

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ _longobjectрд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ:

  • ob_size 3 рдХреА рддрд░рд╣
  • ob_digit рдЬреИрд╕реЗ [0, 0, 1]



рдореИрдВрдиреЗ рдПрдХ рдбреЗрдореЛ рдЖрд░рдИрдкреАрдПрд▓ рдмрдирд╛рдпрд╛ рдЬреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдкрд╛рдпрдерди рдЕрдкрдиреЗ рдЕрдВрджрд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрд░рдЪрдирд╛ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ ob_size, ob_refcountрдЖрджрд┐ред

рдкреВрд░реНрдгрд╛рдВрдХ рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рди


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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛


рдЗрдВрдЯреЗрдЧрд░ рдХреЛ "рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ" рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреНрд░рд╛рдердорд┐рдХ рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рднреА рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ, рдФрд░ рдкрд╛рдпрдерди рд╕реНрд░реЛрдд рдХреЛрдб рд╣рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред x_addрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди longobject.cрджреЛ рдирдВрдмрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

...
    for (i = 0; i < size_b; ++i) {
        carry += a->ob_digit[i] + b->ob_digit[i];
        z->ob_digit[i] = carry & PyLong_MASK;
        carry >>= PyLong_SHIFT;
    }
    for (; i < size_a; ++i) {
        carry += a->ob_digit[i];
        z->ob_digit[i] = carry & PyLong_MASK;
        carry >>= PyLong_SHIFT;
    }
    z->ob_digit[i] = carry;
...

рдКрдкрд░ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ x_addред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рд╛рдЗрдлрд╝рдиреЗрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдпрд╣ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЬреЛрдбрд╝ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЪрд┐рдиреНрд╣ ob_sizeрдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдЪрд┐рдиреНрд╣ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЛрдгрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЛрдгрд╛рддреНрдордХ ob_sizeрд╣реЛрдЧрд╛ред рдорд╛рди ob_sizeрдореЛрдбреБрд▓реЛ рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ ob_digitред

рдШрдЯрд╛рд╡


рдЬреИрд╕реЗ рдЬреЛрдбрд╝ рдШрдЯрддрд╛ рд╣реИ, рд╡реИрд╕реЗ рд╣реА рдШрдЯрд╛рд╡ рднреА рд╣реЛрддрд╛ рд╣реИред x_subрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╛рдо рд╡рд╛рд▓рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди longobject.cрджреВрд╕рд░реЗ рд╕реЗ рдПрдХ рдирдВрдмрд░ рдШрдЯрд╛рддрд╛ рд╣реИред

...
    for (i = 0; i < size_b; ++i) {
        borrow = a->ob_digit[i] - b->ob_digit[i] - borrow;
        z->ob_digit[i] = borrow & PyLong_MASK;
        borrow >>= PyLong_SHIFT;
        borrow &= 1; /* Keep only one sign bit */
    }
    for (; i < size_a; ++i) {
        borrow = a->ob_digit[i] - borrow;
        z->ob_digit[i] = borrow & PyLong_MASK;
        borrow >>= PyLong_SHIFT;
        borrow &= 1; /* Keep only one sign bit */
    }
...

рдКрдкрд░ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ x_subред рдЗрд╕рдореЗрдВ, рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИ рдФрд░ рдШрдЯрд╛рд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИред

рдЧреБрдгрди


рдФрд░ рдлрд┐рд░, рдЧреБрдгрд╛ рдХреЛ рдЙрд╕реА рднреЛрд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд╣рдордиреЗ рдкреНрд░рд╛рдердорд┐рдХ рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдЧрдгрд┐рдд рдХреЗ рдкрд╛рдареЛрдВ рд╕реЗ рд╕реАрдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИред рджрдХреНрд╖рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди , рдХрд░рддрд╕реБрдмрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ , рдЬреЛ рдУ (рдПрди рд▓реЙрдЧ 2 3 ) рд╕рд░рд▓ рдЪрд░рдгреЛрдВ рдореЗрдВ рджреЛ рдПрди-рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИ ред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд╛рд░реНрдпреЛрдВ k_mul рдФрд░ k_lopsided_mulрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ longobject.cред

рдбрд┐рд╡реАрдЬрди рдФрд░ рдЕрдиреНрдп рд╕рдВрдЪрд╛рд▓рди


рдкреВрд░реНрдгрд╛рдВрдХ рдкрд░ рд╕рднреА рдСрдкрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ longobject.c, рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдХрд╛рдо рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ: рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдХрд╛рдо рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╕рдордЭ рдореЗрдВ рд╕рдордп рд▓рдЧреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреЙрдкрдХреЙрд░реНрди рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡-рд╕реНрдЯреЙрдХ рдХрд░реЗрдВ ред


рдЕрдЬрдЧрд░ preallocates рдПрдХ рд╕реЗ -5 256 рд╕реЗ рд▓реЗрдХрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдЗрд╕ рдЖрд╡рдВрдЯрди рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рддрдм рд╕реЗ рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ (рдЕрдЪрд▓ рд╕реНрдерд┐рддрд┐) рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ, рдЗрди рдкреВрд░реНрд╡ рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ / рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдмреЗрдЪрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкрд╣рд▓реЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдореИрдХреНрд░реЛ IS_SMALL_INTрдФрд░ рдлрд╝рдВрдХреНрд╢рди get_small_intрд╕реА рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ longobject.cред рдЗрд╕рд▓рд┐рдП рдкрд╛рдпрдерди рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдФрд░ рд╕рдордп рдмрдЪрд╛рддрд╛ рд╣реИред

рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдиреИрд▓реНрд╕ рд╕реАрд░реАрдЬрд╝ рдХрд╛ рдпрд╣ рджреВрд╕рд░рд╛ рд▓реЗрдЦ рд╣реИред рдкрд╣рд▓рд╛ рд▓реЗрдЦ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреИрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛рдЕрд╕реНрдкрд╖реНрдЯ ред рдпрд╣ рдкрд╛рдпрдерди рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рдЙрдард╛рдиреЗ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧрд╛ рдФрд░ рдкрд╛рдпрдерди рдХрд░реНрдиреЗрд▓ рдбреЗрд╡рд▓рдкрд░ рдмрдирдиреЗ рдХрд╛ рдорд╛рд░реНрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рд╕рдорд╛рди рд▓реЗрдЦ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░реЗ рдиреНрдпреВрдЬрд╝рд▓реЗрдЯрд░ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдЗрдирдмреЙрдХреНрд╕ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдореИрдВ рд╣рд░ рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреЛ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ, рд╕рд┐рд╕реНрдЯрдо рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдИрдореЗрд▓ рдкрд░ рдореБрдЭреЗ @arpit_bhayani ред рдЖрдк рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ @ arpitbhayani.me / рдмреНрд▓реЙрдЧ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдХреЛрд░реНрд╕ рдкрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ !

All Articles