fork download
  1. // 2^(expn2)を有効数字disp10桁の10進数で指数表示する。
  2. // Usage: print_by_decimal <expn2> <disp10>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <stdint.h>
  6. #include <assert.h>
  7. #include <vector>
  8. #include <utility>
  9.  
  10. #include <time.h>
  11.  
  12. // 指数の型
  13. typedef int64_t expn_t;
  14.  
  15. // 上の桁の10の剰余を繰り込んでもuint32_tが桁あふれしない最大のビット数
  16. #define DIGIT_BITS 27
  17.  
  18. static_assert(UINT32_MAX / 9UL >= (1UL << DIGIT_BITS), "*** ERR ***");
  19. static_assert((9UL << DIGIT_BITS) + ((1UL << DIGIT_BITS) - 1UL) <= UINT32_MAX, "*** ERR ***");
  20.  
  21. // 除数定義
  22. // 除数は10で固定する。
  23. // DIGIT_BITSを10で割る用に最適化しているので一般化困難。
  24. const int DIVISOR = 10;
  25.  
  26. namespace
  27. {
  28. uint32_t div_by_10(uint32_t mbuf[], const size_t sz_, uint32_t& ulNonZeroBits, expn_t& progress)
  29. {
  30. // 出力パラメータ初期化
  31. ulNonZeroBits = 0UL;
  32. progress = 0;
  33.  
  34. // 冒頭の0をスキップ
  35. // スキップできた個数が進捗でもある。
  36. size_t sz = sz_;
  37. while (sz > 0 && mbuf[sz - 1] == 0UL) {
  38. progress++;
  39. sz--;
  40. }
  41.  
  42. // 最初の非0要素以降を処理
  43. uint32_t remain = 0UL;
  44. for (size_t i = sz; i > 0; i--) {
  45. const long dividend = (remain << DIGIT_BITS) + mbuf[i - 1];
  46. ulNonZeroBits |= dividend;
  47. const long quotient = dividend / DIVISOR;
  48. remain = dividend - quotient * DIVISOR;
  49. assert(0 <= remain && remain < 10);
  50. mbuf[i - 1] = quotient;
  51. }
  52.  
  53. return remain;
  54. }
  55.  
  56. } // namespace
  57.  
  58. int main(const int argc, char* argv[])
  59. {
  60. // 2のべきの指数
  61. //expn_t expn2 = 17179869183; // 0.000001% / 113秒
  62. expn_t expn2 = 1000;
  63. //expn_t expn2 = 64;
  64. //expn_t expn2 = 32;
  65. //expn_t expn2 = 16;
  66. //expn_t expn2 = 8;
  67. //expn_t expn2 = 0;
  68.  
  69. // 表示桁数(有効数字)
  70. expn_t disp10 = 64;
  71.  
  72. #ifdef _WIN32
  73. if (argc >= 2) {
  74. expn2 = _atoi64(argv[1]);
  75. }
  76. if (argc >= 3) {
  77. disp10 = _atoi64(argv[2]);
  78. }
  79. #else
  80. (void)(argc, argv);
  81. #endif
  82.  
  83. // 2^(expn2)のバッファ確保
  84. const size_t sz = (size_t)expn2 / (size_t)DIGIT_BITS + (size_t)1;
  85. std::vector<uint32_t> mbuf(sz, 0L);
  86.  
  87. // 2^(expn2)代入
  88. mbuf[sz - 1] = 1L << ((size_t)expn2 - (size_t)DIGIT_BITS * (sz - 1));
  89.  
  90. // 桁バッファ確保
  91. std::vector<uint8_t> decimals((size_t)disp10);
  92.  
  93. // 10進数の下の桁から順次取得
  94. // 被除数が0になるまで10でひたすら割り続ける。
  95. expn_t expn10 = 0;
  96. expn_t idx = 0;
  97. const time_t startTmg = time(NULL);
  98. time_t prevTmg = startTmg;
  99. for (;;) {
  100. // 10で割る
  101. uint32_t ulNonZeroBits;
  102. expn_t progress;
  103. const uint32_t remain = div_by_10(&(mbuf[0]), sz, ulNonZeroBits, progress);
  104. assert(0 <= remain && remain < 10);
  105.  
  106. // 進捗表示
  107. const time_t now = time(NULL);
  108. fprintf(stderr, "[%lld] %f %% (%lld/%zu) --- %lld sec\r",
  109. expn10, 100.0 * (double)progress / (double)sz, progress, sz, now - startTmg);
  110. if (now != prevTmg) {
  111. fprintf(stderr, "\n");
  112. prevTmg = now;
  113. }
  114.  
  115. // 修了判定
  116. if (ulNonZeroBits == 0UL) {
  117. // (被除数が0になった)
  118. assert(remain == 0UL);
  119. expn10--;
  120. break;
  121. }
  122.  
  123. // 桁を記憶
  124. if (idx >= disp10) {
  125. idx = 0;
  126. }
  127. decimals[idx++] = (uint8_t)remain;
  128. expn10++;
  129. }
  130. fprintf(stderr, "\n");
  131.  
  132. // 表示
  133. printf("2^%lld = ", expn2);
  134. const expn_t ndisp = std::min(disp10, expn10 + 1);
  135. if (ndisp <= 1) {
  136. printf("%d", decimals[--idx]);
  137. }
  138. else {
  139. printf("%d.", decimals[--idx]);
  140. for (expn_t i = 1; i < ndisp; i++) {
  141. if (idx <= 0) {
  142. idx = disp10;
  143. }
  144. printf("%d", decimals[--idx]);
  145. }
  146. printf(" x 10^%lld\n", expn10);
  147. }
  148. }
  149.  
Success #stdin #stdout #stderr 0.01s 5316KB
stdin
Standard input is empty
stdout
2^1000 = 1.071508607186267320948425049060001810561404811705533607443750388 x 10^301
stderr
[0] 0.000000 % (0/38) --- 0 sec
[1] 2.631579 % (1/38) --- 0 sec
[2] 2.631579 % (1/38) --- 0 sec
[3] 2.631579 % (1/38) --- 0 sec
[4] 2.631579 % (1/38) --- 0 sec
[5] 2.631579 % (1/38) --- 0 sec
[6] 2.631579 % (1/38) --- 0 sec
[7] 2.631579 % (1/38) --- 0 sec
[8] 2.631579 % (1/38) --- 0 sec
[9] 5.263158 % (2/38) --- 0 sec
[10] 5.263158 % (2/38) --- 0 sec
[11] 5.263158 % (2/38) --- 0 sec
[12] 5.263158 % (2/38) --- 0 sec
[13] 5.263158 % (2/38) --- 0 sec
[14] 5.263158 % (2/38) --- 0 sec
[15] 5.263158 % (2/38) --- 0 sec
[16] 5.263158 % (2/38) --- 0 sec
[17] 7.894737 % (3/38) --- 0 sec
[18] 7.894737 % (3/38) --- 0 sec
[19] 7.894737 % (3/38) --- 0 sec
[20] 7.894737 % (3/38) --- 0 sec
[21] 7.894737 % (3/38) --- 0 sec
[22] 7.894737 % (3/38) --- 0 sec
[23] 7.894737 % (3/38) --- 0 sec
[24] 7.894737 % (3/38) --- 0 sec
[25] 10.526316 % (4/38) --- 0 sec
[26] 10.526316 % (4/38) --- 0 sec
[27] 10.526316 % (4/38) --- 0 sec
[28] 10.526316 % (4/38) --- 0 sec
[29] 10.526316 % (4/38) --- 0 sec
[30] 10.526316 % (4/38) --- 0 sec
[31] 10.526316 % (4/38) --- 0 sec
[32] 10.526316 % (4/38) --- 0 sec
[33] 13.157895 % (5/38) --- 0 sec
[34] 13.157895 % (5/38) --- 0 sec
[35] 13.157895 % (5/38) --- 0 sec
[36] 13.157895 % (5/38) --- 0 sec
[37] 13.157895 % (5/38) --- 0 sec
[38] 13.157895 % (5/38) --- 0 sec
[39] 13.157895 % (5/38) --- 0 sec
[40] 13.157895 % (5/38) --- 0 sec
[41] 15.789474 % (6/38) --- 0 sec
[42] 15.789474 % (6/38) --- 0 sec
[43] 15.789474 % (6/38) --- 0 sec
[44] 15.789474 % (6/38) --- 0 sec
[45] 15.789474 % (6/38) --- 0 sec
[46] 15.789474 % (6/38) --- 0 sec
[47] 15.789474 % (6/38) --- 0 sec
[48] 15.789474 % (6/38) --- 0 sec
[49] 15.789474 % (6/38) --- 0 sec
[50] 18.421053 % (7/38) --- 0 sec
[51] 18.421053 % (7/38) --- 0 sec
[52] 18.421053 % (7/38) --- 0 sec
[53] 18.421053 % (7/38) --- 0 sec
[54] 18.421053 % (7/38) --- 0 sec
[55] 18.421053 % (7/38) --- 0 sec
[56] 18.421053 % (7/38) --- 0 sec
[57] 18.421053 % (7/38) --- 0 sec
[58] 21.052632 % (8/38) --- 0 sec
[59] 21.052632 % (8/38) --- 0 sec
[60] 21.052632 % (8/38) --- 0 sec
[61] 21.052632 % (8/38) --- 0 sec
[62] 21.052632 % (8/38) --- 0 sec
[63] 21.052632 % (8/38) --- 0 sec
[64] 21.052632 % (8/38) --- 0 sec
[65] 21.052632 % (8/38) --- 0 sec
[66] 23.684211 % (9/38) --- 0 sec
[67] 23.684211 % (9/38) --- 0 sec
[68] 23.684211 % (9/38) --- 0 sec
[69] 23.684211 % (9/38) --- 0 sec
[70] 23.684211 % (9/38) --- 0 sec
[71] 23.684211 % (9/38) --- 0 sec
[72] 23.684211 % (9/38) --- 0 sec
[73] 23.684211 % (9/38) --- 0 sec
[74] 26.315789 % (10/38) --- 0 sec
[75] 26.315789 % (10/38) --- 0 sec
[76] 26.315789 % (10/38) --- 0 sec
[77] 26.315789 % (10/38) --- 0 sec
[78] 26.315789 % (10/38) --- 0 sec
[79] 26.315789 % (10/38) --- 0 sec
[80] 26.315789 % (10/38) --- 0 sec
[81] 26.315789 % (10/38) --- 0 sec
[82] 28.947368 % (11/38) --- 0 sec
[83] 28.947368 % (11/38) --- 0 sec
[84] 28.947368 % (11/38) --- 0 sec
[85] 28.947368 % (11/38) --- 0 sec
[86] 28.947368 % (11/38) --- 0 sec
[87] 28.947368 % (11/38) --- 0 sec
[88] 28.947368 % (11/38) --- 0 sec
[89] 28.947368 % (11/38) --- 0 sec
[90] 31.578947 % (12/38) --- 0 sec
[91] 31.578947 % (12/38) --- 0 sec
[92] 31.578947 % (12/38) --- 0 sec
[93] 31.578947 % (12/38) --- 0 sec
[94] 31.578947 % (12/38) --- 0 sec
[95] 31.578947 % (12/38) --- 0 sec
[96] 31.578947 % (12/38) --- 0 sec
[97] 31.578947 % (12/38) --- 0 sec
[98] 34.210526 % (13/38) --- 0 sec
[99] 34.210526 % (13/38) --- 0 sec
[100] 34.210526 % (13/38) --- 0 sec
[101] 34.210526 % (13/38) --- 0 sec
[102] 34.210526 % (13/38) --- 0 sec
[103] 34.210526 % (13/38) --- 0 sec
[104] 34.210526 % (13/38) --- 0 sec
[105] 34.210526 % (13/38) --- 0 sec
[106] 36.842105 % (14/38) --- 0 sec
[107] 36.842105 % (14/38) --- 0 sec
[108] 36.842105 % (14/38) --- 0 sec
[109] 36.842105 % (14/38) --- 0 sec
[110] 36.842105 % (14/38) --- 0 sec
[111] 36.842105 % (14/38) --- 0 sec
[112] 36.842105 % (14/38) --- 0 sec
[113] 36.842105 % (14/38) --- 0 sec
[114] 36.842105 % (14/38) --- 0 sec
[115] 39.473684 % (15/38) --- 0 sec
[116] 39.473684 % (15/38) --- 0 sec
[117] 39.473684 % (15/38) --- 0 sec
[118] 39.473684 % (15/38) --- 0 sec
[119] 39.473684 % (15/38) --- 0 sec
[120] 39.473684 % (15/38) --- 0 sec
[121] 39.473684 % (15/38) --- 0 sec
[122] 39.473684 % (15/38) --- 0 sec
[123] 42.105263 % (16/38) --- 0 sec
[124] 42.105263 % (16/38) --- 0 sec
[125] 42.105263 % (16/38) --- 0 sec
[126] 42.105263 % (16/38) --- 0 sec
[127] 42.105263 % (16/38) --- 0 sec
[128] 42.105263 % (16/38) --- 0 sec
[129] 42.105263 % (16/38) --- 0 sec
[130] 42.105263 % (16/38) --- 0 sec
[131] 44.736842 % (17/38) --- 0 sec
[132] 44.736842 % (17/38) --- 0 sec
[133] 44.736842 % (17/38) --- 0 sec
[134] 44.736842 % (17/38) --- 0 sec
[135] 44.736842 % (17/38) --- 0 sec
[136] 44.736842 % (17/38) --- 0 sec
[137] 44.736842 % (17/38) --- 0 sec
[138] 44.736842 % (17/38) --- 0 sec
[139] 47.368421 % (18/38) --- 0 sec
[140] 47.368421 % (18/38) --- 0 sec
[141] 47.368421 % (18/38) --- 0 sec
[142] 47.368421 % (18/38) --- 0 sec
[143] 47.368421 % (18/38) --- 0 sec
[144] 47.368421 % (18/38) --- 0 sec
[145] 47.368421 % (18/38) --- 0 sec
[146] 47.368421 % (18/38) --- 0 sec
[147] 50.000000 % (19/38) --- 0 sec
[148] 50.000000 % (19/38) --- 0 sec
[149] 50.000000 % (19/38) --- 0 sec
[150] 50.000000 % (19/38) --- 0 sec
[151] 50.000000 % (19/38) --- 0 sec
[152] 50.000000 % (19/38) --- 0 sec
[153] 50.000000 % (19/38) --- 0 sec
[154] 50.000000 % (19/38) --- 0 sec
[155] 52.631579 % (20/38) --- 0 sec
[156] 52.631579 % (20/38) --- 0 sec
[157] 52.631579 % (20/38) --- 0 sec
[158] 52.631579 % (20/38) --- 0 sec
[159] 52.631579 % (20/38) --- 0 sec
[160] 52.631579 % (20/38) --- 0 sec
[161] 52.631579 % (20/38) --- 0 sec
[162] 52.631579 % (20/38) --- 0 sec
[163] 55.263158 % (21/38) --- 0 sec
[164] 55.263158 % (21/38) --- 0 sec
[165] 55.263158 % (21/38) --- 0 sec
[166] 55.263158 % (21/38) --- 0 sec
[167] 55.263158 % (21/38) --- 0 sec
[168] 55.263158 % (21/38) --- 0 sec
[169] 55.263158 % (21/38) --- 0 sec
[170] 55.263158 % (21/38) --- 0 sec
[171] 57.894737 % (22/38) --- 0 sec
[172] 57.894737 % (22/38) --- 0 sec
[173] 57.894737 % (22/38) --- 0 sec
[174] 57.894737 % (22/38) --- 0 sec
[175] 57.894737 % (22/38) --- 0 sec
[176] 57.894737 % (22/38) --- 0 sec
[177] 57.894737 % (22/38) --- 0 sec
[178] 57.894737 % (22/38) --- 0 sec
[179] 57.894737 % (22/38) --- 0 sec
[180] 60.526316 % (23/38) --- 0 sec
[181] 60.526316 % (23/38) --- 0 sec
[182] 60.526316 % (23/38) --- 0 sec
[183] 60.526316 % (23/38) --- 0 sec
[184] 60.526316 % (23/38) --- 0 sec
[185] 60.526316 % (23/38) --- 0 sec
[186] 60.526316 % (23/38) --- 0 sec
[187] 60.526316 % (23/38) --- 0 sec
[188] 63.157895 % (24/38) --- 0 sec
[189] 63.157895 % (24/38) --- 0 sec
[190] 63.157895 % (24/38) --- 0 sec
[191] 63.157895 % (24/38) --- 0 sec
[192] 63.157895 % (24/38) --- 0 sec
[193] 63.157895 % (24/38) --- 0 sec
[194] 63.157895 % (24/38) --- 0 sec
[195] 63.157895 % (24/38) --- 0 sec
[196] 65.789474 % (25/38) --- 0 sec
[197] 65.789474 % (25/38) --- 0 sec
[198] 65.789474 % (25/38) --- 0 sec
[199] 65.789474 % (25/38) --- 0 sec
[200] 65.789474 % (25/38) --- 0 sec
[201] 65.789474 % (25/38) --- 0 sec
[202] 65.789474 % (25/38) --- 0 sec
[203] 65.789474 % (25/38) --- 0 sec
[204] 68.421053 % (26/38) --- 0 sec
[205] 68.421053 % (26/38) --- 0 sec
[206] 68.421053 % (26/38) --- 0 sec
[207] 68.421053 % (26/38) --- 0 sec
[208] 68.421053 % (26/38) --- 0 sec
[209] 68.421053 % (26/38) --- 0 sec
[210] 68.421053 % (26/38) --- 0 sec
[211] 68.421053 % (26/38) --- 0 sec
[212] 71.052632 % (27/38) --- 0 sec
[213] 71.052632 % (27/38) --- 0 sec
[214] 71.052632 % (27/38) --- 0 sec
[215] 71.052632 % (27/38) --- 0 sec
[216] 71.052632 % (27/38) --- 0 sec
[217] 71.052632 % (27/38) --- 0 sec
[218] 71.052632 % (27/38) --- 0 sec
[219] 71.052632 % (27/38) --- 0 sec
[220] 73.684211 % (28/38) --- 0 sec
[221] 73.684211 % (28/38) --- 0 sec
[222] 73.684211 % (28/38) --- 0 sec
[223] 73.684211 % (28/38) --- 0 sec
[224] 73.684211 % (28/38) --- 0 sec
[225] 73.684211 % (28/38) --- 0 sec
[226] 73.684211 % (28/38) --- 0 sec
[227] 73.684211 % (28/38) --- 0 sec
[228] 76.315789 % (29/38) --- 0 sec
[229] 76.315789 % (29/38) --- 0 sec
[230] 76.315789 % (29/38) --- 0 sec
[231] 76.315789 % (29/38) --- 0 sec
[232] 76.315789 % (29/38) --- 0 sec
[233] 76.315789 % (29/38) --- 0 sec
[234] 76.315789 % (29/38) --- 0 sec
[235] 76.315789 % (29/38) --- 0 sec
[236] 76.315789 % (29/38) --- 0 sec
[237] 78.947368 % (30/38) --- 0 sec
[238] 78.947368 % (30/38) --- 0 sec
[239] 78.947368 % (30/38) --- 0 sec
[240] 78.947368 % (30/38) --- 0 sec
[241] 78.947368 % (30/38) --- 0 sec
[242] 78.947368 % (30/38) --- 0 sec
[243] 78.947368 % (30/38) --- 0 sec
[244] 78.947368 % (30/38) --- 0 sec
[245] 81.578947 % (31/38) --- 0 sec
[246] 81.578947 % (31/38) --- 0 sec
[247] 81.578947 % (31/38) --- 0 sec
[248] 81.578947 % (31/38) --- 0 sec
[249] 81.578947 % (31/38) --- 0 sec
[250] 81.578947 % (31/38) --- 0 sec
[251] 81.578947 % (31/38) --- 0 sec
[252] 81.578947 % (31/38) --- 0 sec
[253] 84.210526 % (32/38) --- 0 sec
[254] 84.210526 % (32/38) --- 0 sec
[255] 84.210526 % (32/38) --- 0 sec
[256] 84.210526 % (32/38) --- 0 sec
[257] 84.210526 % (32/38) --- 0 sec
[258] 84.210526 % (32/38) --- 0 sec
[259] 84.210526 % (32/38) --- 0 sec
[260] 84.210526 % (32/38) --- 0 sec
[261] 86.842105 % (33/38) --- 0 sec
[262] 86.842105 % (33/38) --- 0 sec
[263] 86.842105 % (33/38) --- 0 sec
[264] 86.842105 % (33/38) --- 0 sec
[265] 86.842105 % (33/38) --- 0 sec
[266] 86.842105 % (33/38) --- 0 sec
[267] 86.842105 % (33/38) --- 0 sec
[268] 86.842105 % (33/38) --- 0 sec
[269] 89.473684 % (34/38) --- 0 sec
[270] 89.473684 % (34/38) --- 0 sec
[271] 89.473684 % (34/38) --- 0 sec
[272] 89.473684 % (34/38) --- 0 sec
[273] 89.473684 % (34/38) --- 0 sec
[274] 89.473684 % (34/38) --- 0 sec
[275] 89.473684 % (34/38) --- 0 sec
[276] 89.473684 % (34/38) --- 0 sec
[277] 92.105263 % (35/38) --- 0 sec
[278] 92.105263 % (35/38) --- 0 sec
[279] 92.105263 % (35/38) --- 0 sec
[280] 92.105263 % (35/38) --- 0 sec
[281] 92.105263 % (35/38) --- 0 sec
[282] 92.105263 % (35/38) --- 0 sec
[283] 92.105263 % (35/38) --- 0 sec
[284] 92.105263 % (35/38) --- 0 sec
[285] 94.736842 % (36/38) --- 0 sec
[286] 94.736842 % (36/38) --- 0 sec
[287] 94.736842 % (36/38) --- 0 sec
[288] 94.736842 % (36/38) --- 0 sec
[289] 94.736842 % (36/38) --- 0 sec
[290] 94.736842 % (36/38) --- 0 sec
[291] 94.736842 % (36/38) --- 0 sec
[292] 94.736842 % (36/38) --- 0 sec
[293] 97.368421 % (37/38) --- 0 sec
[294] 97.368421 % (37/38) --- 0 sec
[295] 97.368421 % (37/38) --- 0 sec
[296] 97.368421 % (37/38) --- 0 sec
[297] 97.368421 % (37/38) --- 0 sec
[298] 97.368421 % (37/38) --- 0 sec
[299] 97.368421 % (37/38) --- 0 sec
[300] 97.368421 % (37/38) --- 0 sec
[301] 97.368421 % (37/38) --- 0 sec
[302] 100.000000 % (38/38) --- 0 sec