// 2^(expn2)を有効数字disp10桁の10進数で指数表示する。 // Usage: print_by_decimal <expn2> <disp10> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <assert.h> #include <vector> #include <utility> #include <time.h> // 指数の型 typedef int64_t expn_t; // 上の桁の10の剰余を繰り込んでもuint32_tが桁あふれしない最大のビット数 #define DIGIT_BITS 27 static_assert(UINT32_MAX / 9UL >= (1UL << DIGIT_BITS), "*** ERR ***"); static_assert((9UL << DIGIT_BITS) + ((1UL << DIGIT_BITS) - 1UL) <= UINT32_MAX, "*** ERR ***"); // 除数定義 // 除数は10で固定する。 // DIGIT_BITSを10で割る用に最適化しているので一般化困難。 const int DIVISOR = 10; namespace { uint32_t div_by_10(uint32_t mbuf[], const size_t sz_, uint32_t& ulNonZeroBits, expn_t& progress) { // 出力パラメータ初期化 ulNonZeroBits = 0UL; progress = 0; // 冒頭の0をスキップ // スキップできた個数が進捗でもある。 size_t sz = sz_; while (sz > 0 && mbuf[sz - 1] == 0UL) { progress++; sz--; } // 最初の非0要素以降を処理 uint32_t remain = 0UL; for (size_t i = sz; i > 0; i--) { const long dividend = (remain << DIGIT_BITS) + mbuf[i - 1]; ulNonZeroBits |= dividend; const long quotient = dividend / DIVISOR; remain = dividend - quotient * DIVISOR; assert(0 <= remain && remain < 10); mbuf[i - 1] = quotient; } return remain; } } // namespace int main(const int argc, char* argv[]) { // 2のべきの指数 //expn_t expn2 = 17179869183; // 0.000001% / 113秒 expn_t expn2 = 1000; //expn_t expn2 = 64; //expn_t expn2 = 32; //expn_t expn2 = 16; //expn_t expn2 = 8; //expn_t expn2 = 0; // 表示桁数(有効数字) expn_t disp10 = 64; #ifdef _WIN32 if (argc >= 2) { expn2 = _atoi64(argv[1]); } if (argc >= 3) { disp10 = _atoi64(argv[2]); } #else (void)(argc, argv); #endif // 2^(expn2)のバッファ確保 const size_t sz = (size_t)expn2 / (size_t)DIGIT_BITS + (size_t)1; std::vector<uint32_t> mbuf(sz, 0L); // 2^(expn2)代入 mbuf[sz - 1] = 1L << ((size_t)expn2 - (size_t)DIGIT_BITS * (sz - 1)); // 桁バッファ確保 std::vector<uint8_t> decimals((size_t)disp10); // 10進数の下の桁から順次取得 // 被除数が0になるまで10でひたすら割り続ける。 expn_t expn10 = 0; expn_t idx = 0; const time_t startTmg = time(NULL); time_t prevTmg = startTmg; for (;;) { // 10で割る uint32_t ulNonZeroBits; expn_t progress; const uint32_t remain = div_by_10(&(mbuf[0]), sz, ulNonZeroBits, progress); assert(0 <= remain && remain < 10); // 進捗表示 const time_t now = time(NULL); fprintf(stderr, "[%lld] %f %% (%lld/%zu) --- %lld sec\r", expn10, 100.0 * (double)progress / (double)sz, progress, sz, now - startTmg); if (now != prevTmg) { fprintf(stderr, "\n"); prevTmg = now; } // 修了判定 if (ulNonZeroBits == 0UL) { // (被除数が0になった) assert(remain == 0UL); expn10--; break; } // 桁を記憶 if (idx >= disp10) { idx = 0; } decimals[idx++] = (uint8_t)remain; expn10++; } fprintf(stderr, "\n"); // 表示 printf("2^%lld = ", expn2); const expn_t ndisp = std::min(disp10, expn10 + 1); if (ndisp <= 1) { printf("%d", decimals[--idx]); } else { printf("%d.", decimals[--idx]); for (expn_t i = 1; i < ndisp; i++) { if (idx <= 0) { idx = disp10; } printf("%d", decimals[--idx]); } printf(" x 10^%lld\n", expn10); } }
Standard input is empty
2^1000 = 1.071508607186267320948425049060001810561404811705533607443750388 x 10^301
[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