1を9801で割った計算結果 with Python
この計算結果はミラクルな数が出るんですね〜、凄いですね。
1 / 9801 = ??
循環小数ということで、とりあえず小数以下250位までで設定した計算結果は以下のとおりです。
0.0001020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697990001020304050607080910111213141516171819202122232425263
綺麗に並んでますね〜。しかも98という数値は出てこないという・・・
見やすくするために2桁ずつに分けて並べてみました。小数以下の数値で、後ろのカッコは通番になります。
00 [1] 01 [2] 02 [3] 03 [4] 04 [5] 05 [6] 06 [7] 07 [8] 08 [9] 09 [10] 10 [11] 11 [12] 12 [13] 13 [14] 14 [15] 15 [16] 16 [17] 17 [18] 18 [19] 19 [20] 20 [21] 21 [22] 22 [23] 23 [24] 24 [25] 25 [26] 26 [27] 27 [28] 28 [29] 29 [30] 30 [31] 31 [32] 32 [33] 33 [34] 34 [35] 35 [36] 36 [37] 37 [38] 38 [39] 39 [40] 40 [41] 41 [42] 42 [43] 43 [44] 44 [45] 45 [46] 46 [47] 47 [48] 48 [49] 49 [50] 50 [51] 51 [52] 52 [53] 53 [54] 54 [55] 55 [56] 56 [57] 57 [58] 58 [59] 59 [60] 60 [61] 61 [62] 62 [63] 63 [64] 64 [65] 65 [66] 66 [67] 67 [68] 68 [69] 69 [70] 70 [71] 71 [72] 72 [73] 73 [74] 74 [75] 75 [76] 76 [77] 77 [78] 78 [79] 79 [80] 80 [81] 81 [82] 82 [83] 83 [84] 84 [85] 85 [86] 86 [87] 87 [88] 88 [89] 89 [90] 90 [91] 91 [92] 92 [93] 93 [94] 94 [95] 95 [96] 96 [97] 97 [98] 99 [99] # 98は無し 00 [100] 01 [101] 02 [102] 03 [103] 04 [104] 05 [105] 06 [106] 07 [107] 08 [108] 09 [109] 10 [110] 11 [111] 12 [112] 13 [113] 14 [114] 15 [115] 16 [116] 17 [117] 18 [118] 19 [119] 20 [120] 21 [121] 22 [122] 23 [123] 24 [124] 25 [125] 26 [126] 3 [127]
ちなみに次の循環も同じ様になってるのもまた凄いなって思った次第です。
計算と出力するプログラムはPythonで書きました。
from decimal import Decimal
from decimal import getcontext
getcontext().prec = 250
_miracle_number = Decimal('1') / Decimal('9801')
miracle_number = f"{_miracle_number}"
_decimal = miracle_number.split('.')[1] # 小数点で分けて、小数部のみ抜き出す
max_string = len(_decimal)
step_num = 2 # 2文字ずつの分割
for i in range(0, max_string, step_num):
print(f"{_decimal[i:i+step_num]} [{int(i/step_num)+1}]")
ChatGPTに聞いてみたところ
ちょっと流行りに乗っかってみます。
「1/9801」の計算結果は、0.000102030405060708091011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798です。 このように、1から98までの連続した数字を順番に並べたものが小数点以下の数値として表されます。
計算結果に98が出てくるみたいですね・・・
パソコンの計算精度
今まではここまでの桁数での精度は求められることがなかったので、単に割り算して計算してましたが、それだと今回求められている結果は出てこないみたいですね。
_miracle_number = 1/9801
f"{_miracle_number:.100f}"
# '0.0001020304050607080898274703351091829972574487328529357910156250000000000000000000000000000000000000'
途中で値に変化が出てきました。
勉強になったこと
- Decimal, Fraction
- math.modf()で整数部と小数部に分けたタプルを得ることが出来る
以上になります。またお会いしましょう