Xで「 1÷9801の結果が非常に美しい。」という記事がありまして、その結果が
> 0.00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 99 00 01 02...
このように 98 を除いて綺麗に数字が並んでいるんですよね。これは凄い!
BASICプログラムでやってみたいと思い「 1÷9801 」で検索しても出ないので
AIモードで「 1÷9801の答えを小数表記するBASICプログラムを作成」としたら
それらしいプログラムが例示されたけど結果が違う!
「 1÷9801の答えを小数表記するBASICプログラム」で検索し直したら
キチンと計算結果が出るプログラムの例示が出ました。すげぇ!
-----------------------------------------------------------
AI による概要 1/9801(\(1\div 9801\))の小数表記は、非常に長い循環小数(0.00010203...9899の繰り返し)になります。標準的なBASIC言語の浮動小数点演算(通常は単精度で約7桁、倍精度で約15-16桁の精度)では、この無限に続く循環小数を正確に表示することはできません。?そのため、割り算の筆算の原理を利用して、小数点以下の各桁を個別に計算し、文字列として出力するアプローチが必要です。?
以下は、一般的なBASIC方言(N88-BASICなどを想定)で動作する、小数点以下100桁までを計算・表示するプログラム例です。
basic
10 REM 1/9801 の小数表記プログラム
20 CLS
30 A = 1
40 B = 9801
50 C$ = "0."
60 FOR I = 1 TO 100
70 A = A * 10
80 Q = INT(A / B)
90 R = A MOD B
100 C$ = C$ + STR$(Q)
110 A = R
120 IF A = 0 THEN EXIT FOR
130 NEXT I
140 PRINT C$
150 END
プログラムの解説
A = 1, B = 9801: 分子をA、分母をBとします。
FOR I = 1 TO 100: 小数点以下100桁を計算するためのループです。必要に応じて桁数を変更できます。
A = A * 10: 筆算の次の桁を求めるために、現在の余り(または初期値の1)を10倍します。
Q = INT(A / B): 10倍したAをBで割った商Qが、小数点以下のその桁の数値になります。
R = A MOD B: 剰余演算子MODを使用して余りRを計算します。この余りが次のループでの新しいAになります。
C$ = C$ + STR$(Q): 求めた桁の数値Qを文字列C$に連結していきます。
A = R: 次の計算のために余りをAに代入します。
IF A = 0 THEN EXIT FOR: 余りが0になった場合(割り切れた場合)は、ループを終了します。1/9801の場合は発生しませんが、一般的な分数計算のために含まれています。
PRINT C$: 完成した小数表記の文字列を出力します。
このプログラムは、標準の数値型ではなく、整数の剰余計算を利用することで、浮動小数点数の精度制限を回避しています。
-----------------------------------------------------------
こんな解説なんですが、このままでは TurboBASICでは動かないので改造します。