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

рдЬрдм рдЖрдк рд╕реА рдЬреИрд╕реА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХреНрд╡рд╛рд▓реАрдлрд╛рдпрд░ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рдЖрдк рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмрд╕ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ int
рдпрд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ long
рдпрд╛ рдирд╣реАрдВ long double
ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрди "рдорд╛рдореВрд▓реА" рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдпрдерди integer
рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ редрд╕реА рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 2 20000 рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ powl
рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓реЗрдЧрд╛ inf
ред
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 / рдмреНрд▓реЙрдЧ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ редрдмрд╕ рдЗрддрдирд╛ рд╣реАред рдХреЛрд░реНрд╕ рдкрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ !