(12615)
12615:
1÷9801の答えを小数表記するBASICプログラム
投稿者:
konno
2025/12/15(月) 23:41
コメント数 2
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では動かないので改造します。
- No.12615 -
このTreeへ
[リストへもどる]
pre
(12615)
12616:
Re: 1÷9801の答えを小数表記するBASICプログラム
投稿者:
としき
2025/12/18(木) 00:46
参照先:http://toshiki.la.coocan.jp/
12615 番 konno さんへのコメント コメント数 1
ほほう、AIの出力でさえもきちんと字下げをするんだ。
> こんな解説なんですが、このままでは TurboBASICでは動かないので改造します。
このままではN88-BASICでも動きませんね。
どこが悪いというに、まずN88-BASICにはEXITというコマンドはないのですよ。
なので当然、EXIT FORのところでSyntax Errorが出る。
なので、例えば
> 120 IF A = 0 THEN EXIT FOR
> 130 NEXT I
> 140 PRINT C$
ここのところを
120 IF A = 0 THEN *EXIT_FOR
130 NEXT I
135 *EXIT_FOR
140 PRINT C$
こんな風に書き換えてやる必要がある。
なんとなくこれだけで動き出しそうな気はするけど、そう甘くはないかな。
- No.12616 -
このTreeへ
コメント元:12615 へ
[リストへもどる]
pre
(12615)
12617:
Re^2: 1÷9801の答えを小数表記するBASICプログラム
投稿者:
konno
2025/12/18(木) 01:53
12616 番 としき さんへのコメント
> このままではN88-BASICでも動きませんね。
あ、PC98 で確認してないのがバレた。(^^;
> こんな風に書き換えてやる必要がある。
> なんとなくこれだけで動き出しそうな気はするけど、そう甘くはないかな。
NP2 でやってみましたが、結構色々エラーになるのであちこち修正しました。
10 REM 1/9801 の小数表記プログラム
20 CLS
30 A = 1
40 B = 9801
50 C$ = "0."
55 PRINT C$; ' OV2
60 FOR I = 1 TO 100*2+4 ' 102まで表示するため
70 A = A * 10
80 Q = INT(A / B)
90 R=INT((A/B-INT(A/B))*B+.5) ' MOD 代替式 オーバーフロー OV1
100 C$ = STR$(Q) ' オーバーフロー OV2
105 PRINT C$; ' OV2
110 A = R
120 IF A = 0 THEN *EXIT ' _ は使えない?
130 NEXT I
135 *EXIT ' _ は使えない?
140 PRINT ' C$ ' OV2
145 INPUT AA ' 表示が消えるので
150 END
コメントの行は修正した行です。
- No.12617 -
このTreeへ
コメント元:12616 へ
[リストへもどる]
pre
(12615)
12618:
1÷9801の J31BASICプログラム
投稿者:
konno
2025/12/18(木) 01:57
12615 番 konno さんへのコメント コメント数 1
TurboBASICのプログラムは動きましたが、VTDOSでは動きません。
それで、J31BASICコンパイラで新しいやり方を試してみました。
PRINT文を使うとVTDOSの vtd_err.logに大量のエラーメッセージが発生するので
それを抑制する j3vt.com という常駐プログラムも作りました。
でも常駐ツールが必要とか面倒くさいので、PRINT文を使わずに、INT21h AH09h で
文字出力してみたら、起動時初期化の1045bytesほどで抑えられました。
これが気になる方は j3vt.com を使えばゼロにできます。
#txt:j3vt.lzh
ということで、J31BASICコンパイラ版の 1÷9801 プログラムです。
#txt:9801j.lzh ソース+実行ファイル
VTDOS、DOSVAXJ3、MS-DOS Playerなどの各種DOSエミュで動作します。
VTDOS、MS-DOS Playerは、テキストモードで INT21でPRINTしています。
DOSVAXJ3はグラフィックモードになるので、別処理にしています。
J31BASICコンパイラの可能性がまた一つ広がりました。
- No.12618 -
このTreeへ
コメント元:12615 へ
[リストへもどる]
soft
(12615)
12619:
Re: 1÷9801の J31BASICプログラム
投稿者:
としき
2025/12/20(土) 13:01
参照先:http://toshiki.la.coocan.jp/
12618 番 konno さんへのコメント コメント数 1
> PRINT文を使うとVTDOSの vtd_err.logに大量のエラーメッセージが発生するので
いや、それ、なんか変でしょう。
PRINT文なんて基本的なもので大量にエラーが出るなんて。
何でそんなことに。
> ということで、J31BASICコンパイラ版の 1÷9801 プログラムです。
試してもいない私が言ってはいけないことかもしれませんが。
字下げもされていないプログラムを書く人は、今後、AIに取って代わられます。
今、ウィルスだのセキュリティだのがうるさくなってしまい、どこかの誰かが書いた
プログラムというやつはソースまでチェックされる時代になってしまいましたから。
当然、ソースが出てこなくても安心できるほど作成者にブランド力があれば別。
このブランド力というのには、何かあったときの法的・経済的衝撃に耐えられること、
というのも含むわけで。
私もそろそろAIの軍門に下ることを考えるべきかと思っています。
- No.12619 -
このTreeへ
コメント元:12618 へ
[リストへもどる]
soft
(12615)
12620:
Re^2: 1÷9801の J31BASICプログラム
投稿者:
konno
2025/12/20(土) 17:00
12619 番 としき さんへのコメント
> > PRINT文を使うとVTDOSの vtd_err.logに大量のエラーメッセージが発生するので
> いや、それ、なんか変でしょう。
> PRINT文なんて基本的なもので大量にエラーが出るなんて。
#11226 からのツリーでJ31BASICコンパイラについて色々やってみた中で
#11251 で気が付いたのですが、
VTDOSは 未実装のファンクションをエラーログに出力する仕様になっています。
他のエミュはこのような機能は無く、動作がおかしい時はデバッグモードを使うくらいです。
> 特に、Int10h AX=8500 〜 AX=8582 は毎秒30くらい出続けていました。
> J3100テクニカルブックを発掘したので見ると、カーソル位置のアトリビュート読み込みのよう。
> int16h 機能 F6 は、キーバッファのチェックのようです。
> Int6F は、ATOK5制御割り込みのようです。
J31コンパイラはPRINT文で Int10h AX=8500 〜 AX=8582 を使っているのでこうなるのです。
今回 INT21 AH09h を使うことで Int10h AX=8500 と Int6F を各1回だけになりました。
多分起動時の初期化で使っていると思われます。
前回もそうですが、今回汎用で使えるDOS用BASICコンパイラが無いか探してみました。
実行ファイルのみで動作するもの、機種依存しないものは意外と少なくて前回は諦めましたが
今回は、書式など独自仕様ではあるものの、DOSツールとして使えそうなものを見つけました。
というか、前回は移植を挫折したものを、なんとか移植に成功したのです。
続きは別記事で。
> 字下げもされていないプログラムを書く人は、今後、AIに取って代わられます。
> 今、ウィルスだのセキュリティだのがうるさくなってしまい、どこかの誰かが書いた
> プログラムというやつはソースまでチェックされる時代になってしまいましたから。
AIもうまく使いこなさないと嘘に騙されそうでまだまだ信頼できませんね。
> 当然、ソースが出てこなくても安心できるほど作成者にブランド力があれば別。
> このブランド力というのには、何かあったときの法的・経済的衝撃に耐えられること、
> というのも含むわけで。
うちは多分耐えられないでしょうが、やれるうちは続けていきたいと思っています。
> 私もそろそろAIの軍門に下ることを考えるべきかと思っています。
としきさんがAI化したら凄いことになりそうでわくわく(何か違う?)
- No.12620 -
このTreeへ
コメント元:12619 へ
[リストへもどる]
soft