{"id":428131,"date":"2024-08-02T21:00:16","date_gmt":"2024-08-02T21:00:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=428131"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=428131","title":{"rendered":"<span>\u041a\u0430\u043a \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435 \u0434\u0435\u043b\u044f \u0438\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u043c(\u0438)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1f8\/30a\/894\/1f830a894c518089a199ffc3de9f1685.png\" width=\"540\" height=\"540\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1f8\/30a\/894\/1f830a894c518089a199ffc3de9f1685.png\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u0434 \u043d\u0430 C++ \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0432 \u043a\u043e\u0434  Assembly \u2013 \u0432\u0430\u0441 \u0436\u0434\u0451\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u0432, \u043f\u0440\u0438\u0447\u0451\u043c, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0437\u0430\u043c\u0443\u0434\u0440\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u043b\u043d\u044b\u0439 templates \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439: \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 snippet:<\/p>\n<pre><code class=\"cpp\">uint8_t div10(uint8_t x) {     return x\/10; }<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044f \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b, \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0437\u0434\u0435\u0441\u044c, \u0445\u043e\u0442\u044f, \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0438 \u0441\u0430\u043c\u0438\u043c \u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 <a href=\"https:\/\/godbolt.org\/\" rel=\"noopener noreferrer nofollow\">https:\/\/godbolt.org\/<\/a> \u2013 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, x86-64 gcc 14.1 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u0440\u0430\u0439\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435:<\/p>\n<pre><code class=\"assembly\">div10(unsigned char):         push    rbp         mov     rbp, rsp         mov     eax, edi         mov     BYTE PTR [rbp-4], al         movzx   eax, BYTE PTR [rbp-4]         mov     edx, -51         mul     dl         shr     ax, 8         shr     al, 3         pop     rbp         ret<\/code><\/pre>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0435\u0433\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0432\u0438\u0434\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u043a\u0443\u0441\u043a\u0435 \u043a\u043e\u0434\u0430 \u0442\u0430\u043a \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <a href=\"https:\/\/www.felixcloutier.com\/x86\/div\" rel=\"noopener noreferrer nofollow\">div<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 x86 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0417\u0430\u0442\u043e \u2013 \u043e\u0442\u043a\u0443\u0434\u0430 \u0442\u0430 \u0432\u0437\u044f\u043b\u0430\u0441\u044c \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u0435\u0449\u0451 \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f! \u041d\u0443 \u043b\u0430\u0434\u043d\u043e, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438 \u0440\u0430\u0432\u043d\u0430 205 (\u0442.\u043a. 205+51=256 = mod 256), \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u043a\u0440\u044b\u0442, \u043d\u043e \u043a\u0430\u043a \u0436\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a\u0438 \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/p>\n<h2>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f<\/h2>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 205 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0432\u043f\u0440\u0430\u0432\u043e \u043d\u0430 11 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432, \u0447\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044e \u043d\u0430 2^11 = 2048 \u0441 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u2013 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e. \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e 205\/2048 = 0.10009765625, \u0438\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c 0.1, \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043d\u0430 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0435  (\u0438\u043b\u0438 \u0432 Python) \u043d\u0430 255 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 25.524, \u0438\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u2013 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. <\/p>\n<p>\u0410 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0437\u044f\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 0.1? \u041d\u0435\u0442 \u2013 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0432 \u043d\u0430 10 \u043c\u044b \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 &#171;\u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 1&#187;, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044f \u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u044b 0 \u2013 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435 \u0442\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0448\u044c \u0434\u0435\u043b\u044f 10 \u043d\u0430 10. \u0410 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e, \u0447\u0442\u043e \u0431 \u0442\u0440\u044e\u043a \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b? \u0414\u043b\u044f uint8_t \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u2013 255, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 1\/10 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u043d\u0430 1\/256. \u0410 \u0441 \u043b\u044e\u0431\u044b\u043c \u043b\u0438 \u0447\u0438\u0441\u043b\u043e\u043c (\u0445\u043e\u0442\u044f \u0431\u044b \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430 uint8_t \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e) \u2013 \u0434\u0430, \u0441 \u043b\u044e\u0431\u044b\u043c.<\/p>\n<p>\u0422\u0443\u0442, \u044f \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u043f\u0440\u043e \u0442\u0430\u043a\u0438\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0430\u043a floor, ceil \u0438 trunc: \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 floor=trunc \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c, a ceil \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u0442 \u0432\u0432\u0435\u0440\u0445. \u041f\u0443\u0441\u0442\u044c d \u2013 \u043d\u0430\u0448 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c, N \u2013 \u043d\u0430\u0448\u0430 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c (\u0443 \u043d\u0430\u0441 8),  \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0430: m \/ 2 ^ (N + k) \u0442\u0430\u043a\u043e\u0435 \u0447\u0442\u043e \u043e\u043d\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 1\/d (\u0442\u0443\u0442 \u043e\u0431\u043e \u0432\u0441\u0451\u043c \u0434\u0443\u043c\u0430\u0435\u043c \u0432 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445), \u0430 \u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435 \u0442\u043e: <\/p>\n<p>m \/ (2 ^ (N + k)) &#8212; (1 \/ d) &gt;= 1 \/ 2^N (\u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0430\u0431\u0437\u0430\u0446\u0430).<\/p>\n<h2>\u041a\u0430\u043a \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0447\u0438\u0441\u043b\u0430<\/h2>\n<p>\u0423\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435: m = ceil(2^(ceil(log(d)) + N) \/ d), k = ceil(log(d)) \u2013 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u0443\u0442 \u0442\u0430\u043a\u043e\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e? &#8230; \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: \u0447\u0438\u0441\u043b\u043e \u0432\u043d\u0438\u0437\u0443 \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u044d\u0442\u043e \u0441\u0442\u0435\u043f\u0435\u043d\u044c 2\u043a\u0438, \u0438 \u044d\u0442\u043e \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 2^N, \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u044f \u043a\u0430\u043a-\u0442\u043e \u043d\u0430\u0448\u0451\u043b k \u2013 \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u0430\u043a \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c m ?  \u042f \u0443\u0436\u0435 \u0437\u043d\u0430\u044e \u0437\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044c \u2013 2 ^ (N + k), \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0447\u0442\u043e \u0431 \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c 1\/d, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u044f \u0432\u043e\u0437\u044c\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e trunc(2 ^ (N + k) \/ d) ? <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432 \u0447\u0438\u0441\u043b\u0430\u0445 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u044f \u0445\u043e\u0447\u0443 \u0434\u0435\u043b\u0438\u0442\u044c uint8_t \u043d\u0430 10: \u0442.\u0435. N=8, d = 10, \u0430 k \u043f\u043e\u043a\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0440\u0430\u0432\u043d\u044b\u043c 2, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u0433\u0434\u0430 trunc(2 ^ (N + k) \/ d) = trunk(2^10 \/ 10) = trunk (1024 \/10) = 102, \u0430 \u0432\u0441\u0451 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 m \/ (2 ^ (N + k)) = 102\/ 1024 = 0,099609375, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0431\u043b\u0438\u0437\u043a\u043e, \u043d\u043e \u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u043d\u0430\u043c \u043d\u0430\u0434\u043e. \u0410 \u0432\u043e\u0442 ceil &#8212; \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e: ceil(x) &gt;= x \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.  \u042f \u0435\u0449\u0451 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b \u044d\u0442\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0443, \u043d\u043e \u0441\u0434\u0435\u043b\u0430\u044e, \u0447\u0442\u043e d &gt; 1 \u0438 d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0434\u0432\u043e\u0439\u043a\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u0447\u043d\u044b\u0445 \u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0443 \u043d\u0430\u0441 \u0442\u0443\u0442 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0432\u0442\u043e\u0440\u0430\u044f \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 trunc (x\/y) \u0432 C++ \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e m \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u043a\u0430\u043a \u044f \u0438\u0449\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u0435\u0442 1\/d \u0441\u0432\u0435\u0440\u0445\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0442\u0430\u043a\u043e\u0435 k: ceil(2^(ceil(log(d)) + N) \/ d, \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u043b\u0430\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0439 ceil \u044f \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u044e \u043a \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044e \u0447\u0438\u0441\u043b\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c d \u2013 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438 \u0440\u0430\u0432\u0435\u043d d, \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e 2^(ceil(log(d)) &gt; d.<\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">template&lt;typename InputInteger, typename OutputInteger&gt; std::pair&lt;OutputInteger, uint8_t&gt; getDisionMultiplier(InputInteger divisor) {     if (!divisor)     {         throw std::invalid_argument(\"Division by zero is impossible\");     }      if (divisor == 1)     {         return {1,0};     }      constexpr uint8_t n = sizeof(InputInteger) * CHAR_BIT;      const double log_d_temp = std::log2(static_cast&lt;double&gt;(divisor));     const uint8_t log_d = std::ceil(log_d_temp);      if (log_d == std::floor(log_d_temp))     {         return {1, log_d};     }      OutputInteger res = std::ceil(static_cast&lt;double&gt;(static_cast&lt;OutputInteger&gt;(1) &lt;&lt; (log_d + n)) \/ double(divisor));      return {res, n + log_d}; }  \/\/ somewhere in the main function      for(uint8_t divisor = 1; divisor &gt; 0; divisor++)     {         auto [multiplier, shift] = getDisionMultiplier&lt;uint8_t, uint16_t&gt;(divisor);          for(uint8_t numenator = 1; numenator &gt; 0; numenator++)         {             uint32_t res = static_cast&lt;uint32_t&gt;(numenator * multiplier) &gt;&gt; shift;              if (res != numenator \/ divisor)             {                 std::cout &lt;&lt; \"panic: did something went wrong?\" &lt;&lt; std::endl;             }         }     }<\/code><\/pre>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0443 \u043f\u0440\u043e \u043f\u0430\u043d\u0438\u043a\u0443 \u043c\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u2013 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0441\u0451? \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u043e\u0440\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c? \u2013 \u041d\u0435\u0442.<\/p>\n<h2>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440<\/h2>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0442\u043e\u0447\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u044b\u0432\u0435\u0434\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u0434, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0434\u0430\u0435\u0442 \u0434\u043b\u044f d=10:<\/p>\n<pre><code class=\"cpp\">    auto p = getDisionMultiplier&lt;uint8_t, uint16_t&gt;(static_cast&lt;uint8_t&gt;(10));     std::cout &lt;&lt; p.first &lt;&lt; \" \" &lt;&lt; (uint16_t)(p.second) &lt;&lt; std::endl;<\/code><\/pre>\n<blockquote>\n<p>410 12<\/p>\n<\/blockquote>\n<p>\u0410 \u0438\u0437 \u043a\u0443\u0441\u043a\u0430 Assemly \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b\u0442\u044c 205 \u0438 11&#8230; \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e gcc \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 m \u0442\u043e\u0433\u043e \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0447\u0442\u043e \u0438 d \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0445\u0438\u0442\u0440\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c (\u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0438\u0433\u043b\u044f\u0434\u0438\u0442\u0435\u0441\u044c \u043a \u043c\u043e\u0435\u043c\u0443 \u043a\u043e\u0434\u0443 \u0432\u044b\u0448\u0435 \u2013 \u044f \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0442\u0438\u043f uint16_t). <\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c gcc \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0435 \u043f\u0430\u0440\u044b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 m_low = trunc(2^(ceil(log(d)) + N) \/ d) \u0438 m_high = trunc(2^(ceil(log(d)) + N) + 2^(ceil(log(d)) \/ d), \u0442\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0447\u0442\u043e m_low \u2013 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c m (\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u044d\u0442\u043e \u0432\u044b\u0448\u0435), \u0430 m_high \u2013 \u043c\u043e\u0436\u0435\u0442 (\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0442\u0443\u0442 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0438), \u043d\u043e m_high, \u0432\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 m \u0438\u0437 \u043c\u043e\u0435\u0433\u043e \u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u0414\u0430, \u043d\u043e, \u0438 m_low \u0438 m_high \u2013 \u0442\u043e\u0447\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 2^(N + 1), \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b 9 \u0431\u0438\u0442, \u0438 \u0435\u0449\u0451 \u0442\u043e\u0447\u043d\u043e \u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445 m_high &gt; m_low (\u0431\u0435\u0437 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430). \u0427\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 9-\u0442\u0438 \u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 8-\u043c\u0438 \u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0432\u0438\u043d\u0435\u0442 m_high \u043d\u0430 \u0440\u0430\u0437\u0440\u044f\u0434 \u0432\u043f\u0440\u0430\u0432\u043e: \u0442\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 trunc(m_high\/2), \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u043e\u043d \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 k (\u0447\u0438\u0441\u043b\u043e \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435), \u043d\u043e &#8230;\u0435\u0441\u043b\u0438 \u0447\u0438\u0441\u043b\u043e \u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0435, \u044d\u0442\u043e \u0436\u0435 \u043d\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435? \u0414\u0430, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u0447\u043d\u0451\u043c \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043d\u0438\u0437\u0443&#8230;\u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0435\u0442 \u0438 trunc(m_low \/ 2) \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e m_low \u0443\u0436\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0430 \u2013 \u0435\u0441\u043b\u0438 m_high \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0434\u043e \u043d\u0435\u0451 \u2013 \u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c m_high \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0434\u0432\u0438\u0433. \u0410 \u0432\u043e\u0442 \u0438 \u043a\u043e\u0434 \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u044d\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">template&lt;typename InputInteger&gt; std::tuple&lt;InputInteger, uint8_t, bool&gt; getDisionMultiplier(InputInteger divisor) {     if (!divisor)     {         throw std::invalid_argument(\"Division by zero is impossible\");     }      if (divisor == 1)     {         return {1, 0, false};     }      constexpr uint8_t n = sizeof(InputInteger) * CHAR_BIT;      const double log_d_temp = std::log2(static_cast&lt;double&gt;(divisor));     const uint8_t log_d = std::ceil(log_d_temp);      if (log_d == std::floor(log_d_temp))     {         return {1, log_d, false};     }      uint64_t temp_low = (1UL &lt;&lt; (log_d + n));     uint64_t temp_hight = (1UL &lt;&lt; log_d) | (1UL &lt;&lt; (log_d + n));      temp_hight \/= divisor;     temp_low \/= divisor;      uint8_t additionla_shift = log_d;      while (additionla_shift)     {          if (temp_low \/2 &gt;= temp_hight\/2)         {             break;         }          temp_low \/= 2;         temp_hight \/= 2;          --additionla_shift;     }      return {temp_hight, n + additionla_shift, temp_hight &gt; std::numeric_limits&lt;uint8_t&gt;::max()}; }  \/\/ somewhere in the main function     auto [coeff, shift, _] = getDisionMultiplier(static_cast&lt;uint8_t&gt;(10));     std::cout &lt;&lt; (uint16_t)coeff &lt;&lt; \" \" &lt;&lt; (uint16_t)(shift) &lt;&lt; std::endl;<\/code><\/pre>\n<blockquote>\n<p>205 11<\/p>\n<\/blockquote>\n<p>\u0423\u0441\u043f\u0435\u0445! \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0441\u043e\u0432\u043f\u0430\u043b\u0438! \u0412\u0441\u0451 \u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u043c? \u0423\u0432\u044b: \u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0434\u0443\u0446\u0438\u0440\u0443\u0435\u0442 temp_hight, \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 8-\u043c\u0438 \u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0441\u0440\u0435\u0437 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432 return. Gcc \u0443\u043c\u0435\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0440\u0435\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2013 \u043d\u043e \u044d\u0442\u043e \u044f\u0432\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043c\u0430.<\/p>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0442\u0435\u0440\u043f\u0438\u0442\u0441\u044f, \u0442\u043e \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0441\u0441\u044b\u043b\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043e\u043f\u0438\u0440\u0430\u043b\u0441\u044f<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/gmplib.org\/~tege\/divcnst-pldi94.pdf\" rel=\"noopener noreferrer nofollow\">https:\/\/gmplib.org\/~tege\/divcnst-pldi94.pdf<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/gcc-mirror\/gcc\/blob\/64ca25aec4939aea79bd812b089fbb666ca6f2fd\/gcc\/expmed.cc#L3715\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/gcc-mirror\/gcc\/blob\/64ca25aec4939aea79bd812b089fbb666ca6f2fd\/gcc\/expmed.cc#L3715<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/833470\/\"> https:\/\/habr.com\/ru\/articles\/833470\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u0434 \u043d\u0430 C++ \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0432 \u043a\u043e\u0434  Assembly \u2013 \u0432\u0430\u0441 \u0436\u0434\u0451\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u0432, \u043f\u0440\u0438\u0447\u0451\u043c, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0437\u0430\u043c\u0443\u0434\u0440\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u043b\u043d\u044b\u0439 templates \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439: \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 snippet:<\/p>\n<pre><code class=\"cpp\">uint8_t div10(uint8_t x) {     return x\/10; }<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044f \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b, \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0437\u0434\u0435\u0441\u044c, \u0445\u043e\u0442\u044f, \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0438 \u0441\u0430\u043c\u0438\u043c \u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 <a href=\"https:\/\/godbolt.org\/\" rel=\"noopener noreferrer nofollow\">https:\/\/godbolt.org\/<\/a> \u2013 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, x86-64 gcc 14.1 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u0440\u0430\u0439\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435:<\/p>\n<pre><code class=\"assembly\">div10(unsigned char):         push    rbp         mov     rbp, rsp         mov     eax, edi         mov     BYTE PTR [rbp-4], al         movzx   eax, BYTE PTR [rbp-4]         mov     edx, -51         mul     dl         shr     ax, 8         shr     al, 3         pop     rbp         ret<\/code><\/pre>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0435\u0433\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0432\u0438\u0434\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u043a\u0443\u0441\u043a\u0435 \u043a\u043e\u0434\u0430 \u0442\u0430\u043a \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <a href=\"https:\/\/www.felixcloutier.com\/x86\/div\" rel=\"noopener noreferrer nofollow\">div<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 x86 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0417\u0430\u0442\u043e \u2013 \u043e\u0442\u043a\u0443\u0434\u0430 \u0442\u0430 \u0432\u0437\u044f\u043b\u0430\u0441\u044c \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u0435\u0449\u0451 \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f! \u041d\u0443 \u043b\u0430\u0434\u043d\u043e, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438 \u0440\u0430\u0432\u043d\u0430 205 (\u0442.\u043a. 205+51=256 = mod 256), \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u043a\u0440\u044b\u0442, \u043d\u043e \u043a\u0430\u043a \u0436\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a\u0438 \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/p>\n<h2>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f<\/h2>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 205 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0432\u043f\u0440\u0430\u0432\u043e \u043d\u0430 11 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432, \u0447\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044e \u043d\u0430 2^11 = 2048 \u0441 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u2013 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e. \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e 205\/2048 = 0.10009765625, \u0438\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c 0.1, \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043d\u0430 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0435  (\u0438\u043b\u0438 \u0432 Python) \u043d\u0430 255 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 25.524, \u0438\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u2013 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. <\/p>\n<p>\u0410 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0437\u044f\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 0.1? \u041d\u0435\u0442 \u2013 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0432 \u043d\u0430 10 \u043c\u044b \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 &#171;\u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 1&#187;, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044f \u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u044b 0 \u2013 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435 \u0442\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0448\u044c \u0434\u0435\u043b\u044f 10 \u043d\u0430 10. \u0410 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e, \u0447\u0442\u043e \u0431 \u0442\u0440\u044e\u043a \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b? \u0414\u043b\u044f uint8_t \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u2013 255, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 1\/10 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u043d\u0430 1\/256. \u0410 \u0441 \u043b\u044e\u0431\u044b\u043c \u043b\u0438 \u0447\u0438\u0441\u043b\u043e\u043c (\u0445\u043e\u0442\u044f \u0431\u044b \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430 uint8_t \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e) \u2013 \u0434\u0430, \u0441 \u043b\u044e\u0431\u044b\u043c.<\/p>\n<p>\u0422\u0443\u0442, \u044f \u043d\u0430\u043f\u043e\u043c\u043d\u044e \u043f\u0440\u043e \u0442\u0430\u043a\u0438\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0430\u043a floor, ceil \u0438 trunc: \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 floor=trunc \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c, a ceil \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u0442 \u0432\u0432\u0435\u0440\u0445. \u041f\u0443\u0441\u0442\u044c d \u2013 \u043d\u0430\u0448 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c, N \u2013 \u043d\u0430\u0448\u0430 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c (\u0443 \u043d\u0430\u0441 8),  \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0430: m \/ 2 ^ (N + k) \u0442\u0430\u043a\u043e\u0435 \u0447\u0442\u043e \u043e\u043d\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 1\/d (\u0442\u0443\u0442 \u043e\u0431\u043e \u0432\u0441\u0451\u043c \u0434\u0443\u043c\u0430\u0435\u043c \u0432 \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445), \u0430 \u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435 \u0442\u043e: <\/p>\n<p>m \/ (2 ^ (N + k)) &#8212; (1 \/ d) &gt;= 1 \/ 2^N (\u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0430\u0431\u0437\u0430\u0446\u0430).<\/p>\n<h2>\u041a\u0430\u043a \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0447\u0438\u0441\u043b\u0430<\/h2>\n<p>\u0423\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435: m = ceil(2^(ceil(log(d)) + N) \/ d), k = ceil(log(d)) \u2013 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u0443\u0442 \u0442\u0430\u043a\u043e\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e? &#8230; \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: \u0447\u0438\u0441\u043b\u043e \u0432\u043d\u0438\u0437\u0443 \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u044d\u0442\u043e \u0441\u0442\u0435\u043f\u0435\u043d\u044c 2\u043a\u0438, \u0438 \u044d\u0442\u043e \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 2^N, \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u044f \u043a\u0430\u043a-\u0442\u043e \u043d\u0430\u0448\u0451\u043b k \u2013 \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u0430\u043a \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c m ?  \u042f \u0443\u0436\u0435 \u0437\u043d\u0430\u044e \u0437\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044c \u2013 2 ^ (N + k), \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0447\u0442\u043e \u0431 \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c 1\/d, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u044f \u0432\u043e\u0437\u044c\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e trunc(2 ^ (N + k) \/ d) ? <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432 \u0447\u0438\u0441\u043b\u0430\u0445 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u044f \u0445\u043e\u0447\u0443 \u0434\u0435\u043b\u0438\u0442\u044c uint8_t \u043d\u0430 10: \u0442.\u0435. N=8, d = 10, \u0430 k \u043f\u043e\u043a\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0440\u0430\u0432\u043d\u044b\u043c 2, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u0433\u0434\u0430 trunc(2 ^ (N + k) \/ d) = trunk(2^10 \/ 10) = trunk (1024 \/10) = 102, \u0430 \u0432\u0441\u0451 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 m \/ (2 ^ (N + k)) = 102\/ 1024 = 0,099609375, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0431\u043b\u0438\u0437\u043a\u043e, \u043d\u043e \u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u043d\u0430\u043c \u043d\u0430\u0434\u043e. \u0410 \u0432\u043e\u0442 ceil &#8212; \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e: ceil(x) &gt;= x \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.  \u042f \u0435\u0449\u0451 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b \u044d\u0442\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0443, \u043d\u043e \u0441\u0434\u0435\u043b\u0430\u044e, \u0447\u0442\u043e d &gt; 1 \u0438 d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0434\u0432\u043e\u0439\u043a\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u0447\u043d\u044b\u0445 \u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0443 \u043d\u0430\u0441 \u0442\u0443\u0442 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0432\u0442\u043e\u0440\u0430\u044f \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 trunc (x\/y) \u0432 C++ \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e m \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u043a\u0430\u043a \u044f \u0438\u0449\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u0435\u0442 1\/d \u0441\u0432\u0435\u0440\u0445\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0442\u0430\u043a\u043e\u0435 k: ceil(2^(ceil(log(d)) + N) \/ d, \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u043b\u0430\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0439 ceil \u044f \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u044e \u043a \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044e \u0447\u0438\u0441\u043b\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c d \u2013 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438 \u0440\u0430\u0432\u0435\u043d d, \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e 2^(ceil(log(d)) &gt; d.<\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">template&lt;typename InputInteger, typename OutputInteger&gt; std::pair&lt;OutputInteger, uint8_t&gt; getDisionMultiplier(InputInteger divisor) {     if (!divisor)     {         throw std::invalid_argument(\"Division by zero is impossible\");     }      if (divisor == 1)     {         return {1,0};     }      constexpr uint8_t n = sizeof(InputInteger) * CHAR_BIT;      const double log_d_temp = std::log2(static_cast&lt;double&gt;(divisor));     const uint8_t log_d = std::ceil(log_d_temp);      if (log_d == std::floor(log_d_temp))     {         return {1, log_d};     }      OutputInteger res = std::ceil(static_cast&lt;double&gt;(static_cast&lt;OutputInteger&gt;(1) &lt;&lt; (log_d + n)) \/ double(divisor));      return {res, n + log_d}; }  \/\/ somewhere in the main function      for(uint8_t divisor = 1; divisor &gt; 0; divisor++)     {         auto [multiplier, shift] = getDisionMultiplier&lt;uint8_t, uint16_t&gt;(divisor);          for(uint8_t numenator = 1; numenator &gt; 0; numenator++)         {             uint32_t res = static_cast&lt;uint32_t&gt;(numenator * multiplier) &gt;&gt; shift;              if (res != numenator \/ divisor)             {                 std::cout &lt;&lt; \"panic: did something went wrong?\" &lt;&lt; std::endl;             }         }     }<\/code><\/pre>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0443 \u043f\u0440\u043e \u043f\u0430\u043d\u0438\u043a\u0443 \u043c\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u2013 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0441\u0451? \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u043e\u0440\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c? \u2013 \u041d\u0435\u0442.<\/p>\n<h2>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440<\/h2>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0442\u043e\u0447\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u044b\u0432\u0435\u0434\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u0434, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0434\u0430\u0435\u0442 \u0434\u043b\u044f d=10:<\/p>\n<pre><code class=\"cpp\">    auto p = getDisionMultiplier&lt;uint8_t, uint16_t&gt;(static_cast&lt;uint8_t&gt;(10));     std::cout &lt;&lt; p.first &lt;&lt; \" \" &lt;&lt; (uint16_t)(p.second) &lt;&lt; std::endl;<\/code><\/pre>\n<blockquote>\n<p>410 12<\/p>\n<\/blockquote>\n<p>\u0410 \u0438\u0437 \u043a\u0443\u0441\u043a\u0430 Assemly \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b\u0442\u044c 205 \u0438 11&#8230; \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e gcc \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 m \u0442\u043e\u0433\u043e \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0447\u0442\u043e \u0438 d \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0445\u0438\u0442\u0440\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c (\u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0438\u0433\u043b\u044f\u0434\u0438\u0442\u0435\u0441\u044c \u043a \u043c\u043e\u0435\u043c\u0443 \u043a\u043e\u0434\u0443 \u0432\u044b\u0448\u0435 \u2013 \u044f \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0442\u0438\u043f uint16_t). <\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c gcc \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0435 \u043f\u0430\u0440\u044b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 m_low = trunc(2^(ceil(log(d)) + N) \/ d) \u0438 m_high = trunc(2^(ceil(log(d)) + N) + 2^(ceil(log(d)) \/ d), \u0442\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0447\u0442\u043e m_low \u2013 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c m (\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u044d\u0442\u043e \u0432\u044b\u0448\u0435), \u0430 m_high \u2013 \u043c\u043e\u0436\u0435\u0442 (\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0442\u0443\u0442 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0438), \u043d\u043e m_high, \u0432\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 m \u0438\u0437 \u043c\u043e\u0435\u0433\u043e \u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u0414\u0430, \u043d\u043e, \u0438 m_low \u0438 m_high \u2013 \u0442\u043e\u0447\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 2^(N + 1), \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b 9 \u0431\u0438\u0442, \u0438 \u0435\u0449\u0451 \u0442\u043e\u0447\u043d\u043e \u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445 m_high &gt; m_low (\u0431\u0435\u0437 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430). \u0427\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 9-\u0442\u0438 \u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 8-\u043c\u0438 \u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0432\u0438\u043d\u0435\u0442 m_high \u043d\u0430 \u0440\u0430\u0437\u0440\u044f\u0434 \u0432\u043f\u0440\u0430\u0432\u043e: \u0442\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 trunc(m_high\/2), \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u043e\u043d \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 k (\u0447\u0438\u0441\u043b\u043e \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435), \u043d\u043e &#8230;\u0435\u0441\u043b\u0438 \u0447\u0438\u0441\u043b\u043e \u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0435, \u044d\u0442\u043e \u0436\u0435 \u043d\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435? \u0414\u0430, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u0447\u043d\u0451\u043c \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043d\u0438\u0437\u0443&#8230;\u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0435\u0442 \u0438 trunc(m_low \/ 2) \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e m_low \u0443\u0436\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0430 \u2013 \u0435\u0441\u043b\u0438 m_high \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0434\u043e \u043d\u0435\u0451 \u2013 \u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c m_high \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0434\u0432\u0438\u0433. \u0410 \u0432\u043e\u0442 \u0438 \u043a\u043e\u0434 \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u044d\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">template&lt;typename InputInteger&gt; std::tuple&lt;InputInteger, uint8_t, bool&gt; getDisionMultiplier(InputInteger divisor) {     if (!divisor)     {         throw std::invalid_argument(\"Division by zero is impossible\");     }      if (divisor == 1)     {         return {1, 0, false};     }      constexpr uint8_t n = sizeof(InputInteger) * CHAR_BIT;      const double log_d_temp = std::log2(static_cast&lt;double&gt;(divisor));     const uint8_t log_d = std::ceil(log_d_temp);      if (log_d == std::floor(log_d_temp))     {         return {1, log_d, false};     }      uint64_t temp_low = (1UL &lt;&lt; (log_d + n));     uint64_t temp_hight = (1UL &lt;&lt; log_d) | (1UL &lt;&lt; (log_d + n));      temp_hight \/= divisor;     temp_low \/= divisor;      uint8_t additionla_shift = log_d;      while (additionla_shift)     {          if (temp_low \/2 &gt;= temp_hight\/2)         {             break;         }          temp_low \/= 2;         temp_hight \/= 2;          --additionla_shift;     }      return {temp_hight, n + additionla_shift, temp_hight &gt; std::numeric_limits&lt;uint8_t&gt;::max()}; }  \/\/ somewhere in the main function     auto [coeff, shift, _] = getDisionMultiplier(static_cast&lt;uint8_t&gt;(10));     std::cout &lt;&lt; (uint16_t)coeff &lt;&lt; \" \" &lt;&lt; (uint16_t)(shift) &lt;&lt; std::endl;<\/code><\/pre>\n<blockquote>\n<p>205 11<\/p>\n<\/blockquote>\n<p>\u0423\u0441\u043f\u0435\u0445! \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0441\u043e\u0432\u043f\u0430\u043b\u0438! \u0412\u0441\u0451 \u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u043c? \u0423\u0432\u044b: \u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0434\u0443\u0446\u0438\u0440\u0443\u0435\u0442 temp_hight, \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 8-\u043c\u0438 \u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0441\u0440\u0435\u0437 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432 return. Gcc \u0443\u043c\u0435\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0440\u0435\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2013 \u043d\u043e \u044d\u0442\u043e \u044f\u0432\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043c\u0430.<\/p>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0442\u0435\u0440\u043f\u0438\u0442\u0441\u044f, \u0442\u043e \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0441\u0441\u044b\u043b\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043e\u043f\u0438\u0440\u0430\u043b\u0441\u044f<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/gmplib.org\/~tege\/divcnst-pldi94.pdf\" rel=\"noopener noreferrer nofollow\">https:\/\/gmplib.org\/~tege\/divcnst-pldi94.pdf<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/gcc-mirror\/gcc\/blob\/64ca25aec4939aea79bd812b089fbb666ca6f2fd\/gcc\/expmed.cc#L3715\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/gcc-mirror\/gcc\/blob\/64ca25aec4939aea79bd812b089fbb666ca6f2fd\/gcc\/expmed.cc#L3715<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/833470\/\"> https:\/\/habr.com\/ru\/articles\/833470\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-428131","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/428131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=428131"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/428131\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=428131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=428131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=428131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}