11165:
Re: MOD と ¥ の有効範囲
投稿者:
konno 2024/03/18(月) 00:36
11161 番 konno さんへのコメント
MOD と \ の有効範囲テストを NP2 でやってみました。
結果は 32767 を超えると オーバーフローエラーになりました。
また、N88BASICでは行番号が必要で、タブは使えなかったので
以下のようにプログラムを修正しました。
10 'N88mod.bas
14 print " input ";
20 input a '
30 OPEN "mod.dat" FOR append AS#1 'ファイル出力
40 print " a MOD i ","2bytes "," Froat "," a / i"
50 for i=2 to 5
60 bb=int((a/i-int(a/i))*i+.5) ' MOD 代替式
70 print a;"mod";i,
72 if a>32767 then print "over! ", else print a mod i, '32767 over
74 print bb,a/i
80 print#1, a;"mod";i,
82 if a>32767 then print#1,"over! ", else print#1, a mod i, ' 32767 over
84 print#1, bb,a/i '
90 next i
100 print " a \ i","2bytes "," Froat "," a / i"
110 for i=2 to 5
120 cc=int(a/i) ' \ 代替式
130 print a;" \ ";i,
132 if a>32767 then print "over! ", else print a \ i, ' 32767 over
134 print cc,a/i '
140 print#1,a;" \ ";i,
142 if a>32767 then print#1,"over! ", else print#1, a \ i, ' 32767 over
144 print#1,cc,a/i '
150 next i
160 PRINT#1,""
170 CLOSE#1
180 '入力待ち
190 print " push eny key ";
200 a$=input$(1)
210 if a$="" then 180
220 end
エラーになるのと不正な結果になるのとどっちが良いかはともかく
MOD と \ の有効範囲は 普通は 32767 までのようですね。
だから素数のような桁数が多くなる計算は UBASIC などを使うのが良いのでしょうね。
- No.11165 - [コメント元:11161] [リストへもどる ] pre
11164:
Re^6: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
としき 2024/03/17(日) 17:26
参照先:http://toshiki.la.coocan.jp/
11160 番 としき さんへのコメント
> マジでN88-BASICに移植することを考えています。
> で、まだ逐語的な変換には手をつけていないのですが。
ぼちぼち、移植を始めています。
・コマンドラインオプションは取得できないので、プログラム冒頭で入力するように
した
・まず真っ先にやったのは、locateのxとyの総入れ替え
・N88-BASICでは、実数型も倍精度型も扱える上限は 1.7*10^38 で差がないため、
変数は全て単精度実数に変更
→実は覚えていなかったけど、FOR文のカウントに使うループ変数に倍精度型は
使えないのだとか。マニュアルに明記してあった
・私の趣味でファイル番号指定の「#1」の前には全て半角空白を入れた
(たぶん、文法的には不要だと思うけど覚えていない)
・#11160で私が指摘した謎の2つのif文はdsp=1のほうだけ残した
・ファイル出力の際に、ループ内でいちいちOPEN/CLOSEするのは非効率的だと思う
ので、最初で開いて最後に閉じるだけにした
今の所はそんな感じ。
とりあえず、机上デバッグでどこまでできるか。
忘れていることが多すぎるなぁ。
- No.11164 - [コメント元:11160] [リストへもどる ] soft
11163:
Re^2: オリジナルの prime.bas のソース
投稿者:
としき 2024/03/17(日) 17:09
参照先:http://toshiki.la.coocan.jp/
11156 番 としき さんへのコメント
お彼岸の墓参りの相談で実家に顔を出してきました。
その折に、30分ほどですが、PC-98に触れて。
> これをそのままN88-BASICに移植すると、こんな感じかなぁ。
> 実行していないので、そのまま動くかどうかはわかりません。
動きました。
細かくはチェックしていませんが、概ね、一発完動。
一発完動教徒なら、このくらい当たり前、というかもしれませんけどね。
> ・110行目のTHENの行番号は省略できたかもしれない。
> つまり、NULLの行番号が許容されるのなら、その場合は単に次の行に制御が移る。
あ、ここが省略できるかは確認してこなかった。
次に行ったときには確認してこよう。といいつつ、忘れそうだけど。
次の週末、金曜日から土曜日にかけて実家に泊まることになったので、それまでには
prime2.basのN88-BASICへの移植を終わらせたいなぁ。
- No.11163 - [コメント元:11156] [リストへもどる ] soft
11162:
Re^6: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
konno 2024/03/12(火) 23:45
11160 番 としき さんへのコメント
> マジでN88-BASICに移植することを考えています。
> で、まだ逐語的な変換には手をつけていないのですが。
私も気になったので、NP2 でやってみました。(^^;
N88BASIC.EXE は画面がピンクになって動かないみたいです。(>_<)
BASIC.COM がコンパイラなんですね。無事コンパイルしたのを実行したら、
入力した数字が素数かどうかを表示するのですね。(^^;
> 気になったのがここ。
> if dsp=1 then print#1,"":gosub 1010
> if n>2000 then gosub 1000 'output
> dsp=1 かつ n>2000 のときは2回出力されるようなんですが、これって仕様的に
> なんとなく妙な気がします。これで正しいのですよね?
もちろんまずいです。(^^; いい加減なだけでした。
> あと、変数 j2 と j3 も、何をやっているのかよくわからない。
> この2つを足し算しているところもあるし。
これですね。
810 if i<j2 then return 'dsp2でカウント表示
j2=j2+j3
820 LOCATE 5,1:PRINT i; '
j2 は表示するまでのカウント数かな?
j3 はオプションの数字で、カウントがこの数字以上になったら次の数字ぶん表示しない
という感じですかね。ほとんど意味がないようですが。(^^;
- No.11162 - [コメント元:11160] [リストへもどる ] pre
11161:
MOD と ¥ の有効範囲
投稿者:
konno 2024/03/12(火) 22:45
11159 番 としき さんへのコメント コメント数 1
> オリジナルの prime.bas では関数になっていますよね。
> ということは、十進BASICでは関数である、ということだと思いますが?
> もしかしたら演算子にもあるかもしれませんけどね。
あうう、キチンと読んでいませんでした。
てっきり私がまた間違った言い方をしてしまったのかと。(^^;
> > > TurboBasicって、MOD関数またはMOD演算子ってないんですか?
> > もちろんありますが、32767以上は駄目みたいです。
> N88-BASICのリファレンスでは、演算前に小数点以下は切り捨てられるとはあります
> が、上限については記載がありません。試してみたいところではあります。
十進BASICで関数を使っているのは、MOD に制限があるからかも。
思いついて TurboBasicでテストプログラムを作ってみました。
'tmod.bas
screen 0
print " input ";:input a '
OPEN "mod.dat" FOR append AS#1 'ファイル出力
print " a MOD i ","2bytes "," Froat "," a / i"
for i=2 to 5
bb=int((a/i-int(a/i))*i+.5) ' MOD 代替式
print a;"mod";i,a mod i,bb,a/i
print#1, a;"mod";i,a mod i,bb,a/i '
next
print " a \ i","2bytes "," Froat "," a / i"
for i=2 to 5
cc=int(a/i) ' \ 代替式
print a;" \ ";i,a \ i,cc,a/i '
print#1,a;" \ ";i,a \ i,cc,a/i '
next
PRINT#1,""
CLOSE#1
100 '入力待ち
print " push eny key ";
a$=input$(1)
if a$="" then 100
end
結果
a MOD/\ i 2bytes Froat a / i"
32767 mod 2 1 1 16383.5
32767 mod 3 1 1 10922.33333333333
32767 mod 4 3 3 8191.75
32767 mod 5 2 2 6553.4
32767 \ 2 16383 16383 16383.5
32767 \ 3 10922 10922 10922.33333333333
32767 \ 4 8191 8191 8191.75
32767 \ 5 6553 6553 6553.4
32768 mod 2 0 0 16384
32768 mod 3 -2 2 10922.66666666667
32768 mod 4 0 0 8192
32768 mod 5 -3 3 6553.6
32768 \ 2 -16384 16384 16384
32768 \ 3 -10922 10922 10922.66666666667
32768 \ 4 -8192 8192 8192
32768 \ 5 -6553 6553 6553.6
32769 mod 2 0 1 16384.5
32769 mod 3 -2 0 10923
32769 mod 4 0 1 8192.25
32769 mod 5 -3 4 6553.8
32769 \ 2 -16384 16384 16384.5
32769 \ 3 -10922 10923 10923
32769 \ 4 -8192 8192 8192.25
32769 \ 5 -6553 6553 6553.8
これを見るとやはり 32768 以上では MOD も ¥ も使えないようですね。
実は今 STIME のタイマーで計算がバグって困ってたんですが、これが原因だったようです。
テストプログラム作成は無駄ではなかった。(~~;
- No.11161 - [コメント元:11159] [リストへもどる ] pre
11160:
Re^5: TurboBasicで素数を表示カウントする PRIME2.EXE
投稿者:
としき 2024/03/12(火) 12:32
参照先:http://toshiki.la.coocan.jp/
11149 番 konno さんへのコメント コメント数 2
> これですね、Prime Number が同じということでお察しください。(^^;
> 手抜きの残骸だったのかなんなのか、今はもうわからないです。(^^;
いや、konnoさんがわからないくらいですから、私にも察することはできません。
それはさておき。
マジでN88-BASICに移植することを考えています。
で、まだ逐語的な変換には手をつけていないのですが。
気になったのがここ。
if dsp=1 then print#1,"":gosub 1010
if n>2000 then gosub 1000 'output
dsp=1 かつ n>2000 のときは2回出力されるようなんですが、これって仕様的に
なんとなく妙な気がします。これで正しいのですよね?
あと、変数 j2 と j3 も、何をやっているのかよくわからない。
この2つを足し算しているところもあるし。
- No.11160 - [コメント元:11149] [リストへもどる ] pre
11159:
Re^3: オリジナルの prime.bas のソース
投稿者:
としき 2024/03/12(火) 02:16
参照先:http://toshiki.la.coocan.jp/
11158 番 konno さんへのコメント コメント数 1
> あう、MOD は演算子でしたね、失礼しました。
???
オリジナルの prime.bas では関数になっていますよね。
ということは、十進BASICでは関数である、ということだと思いますが?
もしかしたら演算子にもあるかもしれませんけどね。
> > TurboBasicって、MOD関数またはMOD演算子ってないんですか?
> もちろんありますが、32767以上は駄目みたいです。
N88-BASICのリファレンスでは、演算前に小数点以下は切り捨てられるとはあります
が、上限については記載がありません。試してみたいところではあります。
- No.11159 - [コメント元:11158] [リストへもどる ] soft
11158:
Re^2: オリジナルの prime.bas のソース
投稿者:
konno 2024/03/11(月) 00:45
11156 番 としき さんへのコメント コメント数 1
> なるほど、MODって関数なんですね。
> N88-BASICでは演算子なんですけどね。
あう、MOD は演算子でしたね、失礼しました。
> これをそのままN88-BASICに移植すると、こんな感じかなぁ。
> 実行していないので、そのまま動くかどうかはわかりません。
> TurboBasicって、MOD関数またはMOD演算子ってないんですか?
もちろんありますが、32767以上は駄目みたいです。
> あと、NEXTの後ろの変数って省略できないんですか?
> でもコンパイラ言語だからあんまり関係ないのか。
省略できると思います。指定した方がわかりやすいと思うので。
> 8ビットのBASICのころは、NEXTの後ろの変数を省略するとマイクロ秒の単位で速く
> なると信じられていて、だから私も省略するのが癖になっているのですよ。
コンパイラ言語ではあんまり関係ないのかもしれないなと思います。
> 高速化といえば、最初のFORの直下のIF文。
> これはループの中に入れておくのはもったいない。
> だって、1回しか比較する必要がないものを何回も比較することになるわけだから。
これはその通りですね、最初の FOR文はいらなかったですね。
うっかりしていました。(^^;
SOSU のソースから切り貼りしたのをそのまま残してしまったのかなぁ。(^^;
- No.11158 - [コメント元:11156] [リストへもどる ] pre
11157:
Re^15: プログラムの作り方
投稿者:
konno 2024/03/11(月) 00:19
11155 番 としき さんへのコメント
> いいかげん、タイトルを変えるべきだということに遅まきながら気がつきました。
私も途中で思ったのですが、まあいいかと。(^^;
> 類似したプログラムが見つからないとき、というのも私の場合はたまにある。
> ん〜、最近はあんまりそういうこともありませんが。
> 例えば、野ざらし言#569 からのツリーで作ったマクロ。
> こういう案件、konnoさんはあまり手を出さないということでしょうか。
そういう案件も多いと思います。その場合でも入出力など使えるルーチンは切り貼りで済まします。
そういえばテレビドラマ「ガリレオ」の教授は思いついたらいきなり数式を書きなぐっていましたね。
そういうやり方ができるのは、c.mosさんくらいではないかと。
> 私も最近はそういうことがなくなったということは、年をとったせいかも。
私も年を取って、昔のやり方でしか出来なくなったような気がします。
BASICのソースは普通大文字で書きますが、最近小文字の行を混在させてますよね。
そこは、自分で一から書いているよという自己主張なのかもしれません。(^^;
- No.11157 - [コメント元:11155] [リストへもどる ] soft
11156:
Re: オリジナルの prime.bas のソース
投稿者:
としき 2024/03/10(日) 18:50
参照先:http://toshiki.la.coocan.jp/
11150 番 konno さんへのコメント コメント数 2
> オリジナルの prime.bas のソースはこれだけです。
なるほど、MODって関数なんですね。
N88-BASICでは演算子なんですけどね。
> INPUT n
> IF MOD(n,2)=0 THEN
> IF n=2 THEN PRINT "素数" ELSE PRINT "合成数"
> ELSE
> FOR i=3 TO SQR(n) STEP 2
> IF MOD(n,i)=0 THEN EXIT FOR
> NEXT i
> IF i<=SQR(n) THEN PRINT "合成数" ELSE PRINT "素数"
> END IF
> END
これをそのままN88-BASICに移植すると、こんな感じかなぁ。
実行していないので、そのまま動くかどうかはわかりません。
100 INPUT N
110 IF N MOD 2=0 THEN 120 ELSE *ELSE1
120 IF N=2 THEN PRINT "素数" ELSE PRINT "合成数"
130 GOTO *ENDIF1
140 *ELSE1
150 I=3
160 WHILE (I<=SQR(N)) AND (N MOD I<>0)
170 I=I+2
180 WEND
190 IF I<=SQR(N) THEN PRINT "合成数" ELSE PRINT "素数"
200 *ENDIF1
210 END
解説すると
・MODは演算子に変更した。
・110行目のTHENの行番号は省略できたかもしれない。
つまり、NULLの行番号が許容されるのなら、その場合は単に次の行に制御が移る。
・ループの脱出条件が複数あるので、FORループからWHILEループに変更した。
> TurboBasic で同じやり方はわからなかったので、自分なりに改造したのが以下
TurboBasicって、MOD関数またはMOD演算子ってないんですか?
あと、NEXTの後ろの変数って省略できないんですか?
でもコンパイラ言語だからあんまり関係ないのか。
8ビットのBASICのころは、NEXTの後ろの変数を省略するとマイクロ秒の単位で速く
なると信じられていて、だから私も省略するのが癖になっているのですよ。
高速化といえば、最初のFORの直下のIF文。
これはループの中に入れておくのはもったいない。
だって、1回しか比較する必要がないものを何回も比較することになるわけだから。
> i=2:gosub PRINT i;:c=c+1 ' 2 素数
> FOR i=3 TO n
こんな感じで十分だと思う。
- No.11156 - [コメント元:11150] [リストへもどる ] pre
11155:
Re^14: プログラムの作り方
投稿者:
としき 2024/03/10(日) 13:59
参照先:http://toshiki.la.coocan.jp/
11154 番 konno さんへのコメント コメント数 1
いいかげん、タイトルを変えるべきだということに遅まきながら気がつきました。
いまさら、という気も大いにしますが。
そして、たいそうな内容を書くわけでもない。
> ここ、私なら始めに類似したプログラムを探してそれを修正して使おうとします。
> ゼロから書き始めるなんて面倒だと思うので私はほとんどやったことがないのですよ。
類似したプログラムが見つからないとき、というのも私の場合はたまにある。
ん〜、最近はあんまりそういうこともありませんが。
例えば、野ざらし言#569 からのツリーで作ったマクロ。
こういう案件、konnoさんはあまり手を出さないということでしょうか。
私も最近はそういうことがなくなったということは、年をとったせいかも。
いかんなぁ。
- No.11155 - [コメント元:11154] [リストへもどる ] soft
11154:
Re^13: としきさんの msgview 完璧なツリー
投稿者:
konno 2024/03/09(土) 23:45
11153 番 としき さんへのコメント コメント数 1
> 私はアイディアをコードではなく日本語で考えている、ということ。
> だから、日本語でメモをしている。
> 逆に言うと、ナイスなコードを思いつく、ということはあんまりなさそうです。
うーむ、私もアイデアが浮かんだ時点では、コードではなく日本語な気もしますが
コード的な、パズルのピース的な漠然としたイメージなのかもしれませんね。
> このときの薄らぼんやりとした記憶では、私、サブルーチンから書き始めるのでは
> なく、全体の大枠から書き始める、という意味でEmmettさんと同じだな、と感じた
> ように覚えています。
> 確かにこの部分、解釈によってはいろいろと怪しいかもしれない。
普通、枝葉であるサブルーチンから書き始める人はいませんよね。(^^;
私も Emmettさんの書き込みを読み直したら、何か違う気がしてきました。
> 》 いつでもいきなり、グローバルの1行目から、じかに書き始めます。
ここ、私なら始めに類似したプログラムを探してそれを修正して使おうとします。
ゼロから書き始めるなんて面倒だと思うので私はほとんどやったことがないのですよ。
# それが改造人間の定めなのさ・・・・ ルルルー・・・
- No.11154 - [コメント元:11153] [リストへもどる ] soft
11153:
Re^12: としきさんの msgview 完璧なツリー
投稿者:
としき 2024/03/09(土) 11:17
参照先:http://toshiki.la.coocan.jp/
11152 番 konno さんへのコメント コメント数 1
多分、最大というか基本的な違いはここ。
> それよりも早く頭の中のアイデアをコードにしたいという欲求が強いのでしょう。(^^;
> # そうしないとアイデアが消えてしまいそうだから。(^^;;
私はアイディアをコードではなく日本語で考えている、ということ。
だから、日本語でメモをしている。
逆に言うと、ナイスなコードを思いつく、ということはあんまりなさそうです。
あと、前述のEmmettさんとの対話の部分、読み直して、もしかしたら私に誤解が
あったかもしれないというのがkonnoさんの指摘で気がついた。
> > 》 僕は、アルゴリズムを最初にどこかにメモしておいて、それに従ってプログラム
> > 》 を組んで行くということはやったことがありません。いつでもいきなり、グロー
> > 》 バルの1行目から、じかに書き始めます。
>
> > あぁ、なるほど、やっと Emmett さんのマクロ作法がわかったような気がします。
> > 基本的な考え方としては、私も Emmett さんとほとんど変わりません。
> > とっても安心しました。
>
> このように同意していますが、その後に
このときの薄らぼんやりとした記憶では、私、サブルーチンから書き始めるのでは
なく、全体の大枠から書き始める、という意味でEmmettさんと同じだな、と感じた
ように覚えています。
確かにこの部分、解釈によってはいろいろと怪しいかもしれない。
- No.11153 - [コメント元:11152] [リストへもどる ] soft
11152:
Re^11: としきさんの msgview 完璧なツリー
投稿者:
konno 2024/03/09(土) 01:38
11151 番 としき さんへのコメント コメント数 1
> BASICもそうですが、先日お送りいただいたperlのコードも含めて、です。
そうでした、直してもらったばかりなのに perl のことを忘れていました。m(__)m
> 私のような横着な人間はどうするかというと、プログラムを作る前に、日本語で
> 設計します。そして、その設計をそのままコードの中にコメントとして残しておく。
> 例えば、今回のkonnoさんのprime2.basを作ろうとするなら、私の書きそうな設計
> は以下のような感じ。
なるほど、これをそのまま各ルーチンのタイトルに使うのですね。
私は手を付けてからどうするか考える癖があるみたいで、
今すぐこのスタイルに切り替えるのは難しそうです。(^^;
でも参考になりました。やってみたいと思います。
> そういえば昔、どこかに似たようなことも書いた気が、と思って検索したら。
> nifty:FGALDC/MES/15/#19030
> に似たようなことを書いていた。
> そうか、ikubohさんではなくてEmmettさんのマクロで勉強したのか。
そうでしたか、実は私も「コメントの多いマクロ」で Emmettさんを思い出してました。(^^;
その Emmettさんの発言を見ると
> 》 僕は、マクロを書く時はとりあえずグローバルマクロからとにかく書き始めます。
> 》 僕は、アルゴリズムを最初にどこかにメモしておいて、それに従ってプログラム
> 》 を組んで行くということはやったことがありません。いつでもいきなり、グロー
> 》 バルの1行目から、じかに書き始めます。
私とおんなじですね。(^^;
それに対してとしきさんも
> あぁ、なるほど、やっと Emmett さんのマクロ作法がわかったような気がします。
> 基本的な考え方としては、私も Emmett さんとほとんど変わりません。
> とっても安心しました。
このように同意していますが、その後に
> でも、大きく異なるところは、私の場合、仮想プログラム言語というかメタ言語
> というか、まぁ日本語のようなもので書いているのです。で、大体まとまったら
> マクロに翻訳する、と。
こう書いていますね。やっぱりスタイルが違うと感じます。(^^;
もちろん、としきさんの方が正統派だと思います。
> いろいろなことを書きましたが。
> 結論は、楽をしましょうよ、ということに尽きるわけで。
楽をする、という意味では、としきさんのような正統派のやりかたが良いと思います。
それが出来ない私は、やっぱり楽をしようと思っていないのかもですね。(^^;
それよりも早く頭の中のアイデアをコードにしたいという欲求が強いのでしょう。(^^;
# そうしないとアイデアが消えてしまいそうだから。(^^;;
- No.11152 - [コメント元:11151] [リストへもどる ] soft
11151:
Re^10: としきさんの msgview 完璧なツリー
投稿者:
としき 2024/03/08(金) 01:08
参照先:http://toshiki.la.coocan.jp/
11148 番 konno さんへのコメント コメント数 1
> > 要は、konnoさんのコードの場合、有効な情報が全くないのがイマイチ。
> うう、これは BASIC コードのことを言っているのですよね。
BASICもそうですが、先日お送りいただいたperlのコードも含めて、です。
> ということで、今はサブルーチンのタイトルや説明、各行のコメントを
> なるべく入れるようにやっている最中です。(^^;
うん、まぁ、最終的な完成品を作るにあたってそういうことは必要ですけどね。
私のような横着な人間はどうするかというと、プログラムを作る前に、日本語で
設計します。そして、その設計をそのままコードの中にコメントとして残しておく。
例えば、今回のkonnoさんのprime2.basを作ろうとするなら、私の書きそうな設計
は以下のような感じ。
初期設定
求める素数上限入力
メインルーチン(サンプルコードを最大限流用)
終了処理(キー入力待ち必須)
出力サブルーチン
ファイル出力
エラー終了ルーチン(自作の××からコピペ)
タイマールーチン(自作の○○からコピペ)
こんな感じで設計ができたら、あとは切った貼った、コピペできないところは仕方
ない作るか。
という風にするわけです。
そうすれば、わざわざコメントを書くということはなくなります。
その上、設計をじっと見つめて、例えば、出力部分はもうちょっと整理できそうだ、
とか、エラーのルーチンはそのままコピペだとイマイチかも、みたいなことも考え
付いたりするわけですよ。
そういえば昔、どこかに似たようなことも書いた気が、と思って検索したら。
nifty:FGALDC/MES/15/#19030
に似たようなことを書いていた。
そうか、ikubohさんではなくてEmmettさんのマクロで勉強したのか。
いろいろなことを書きましたが。
結論は、楽をしましょうよ、ということに尽きるわけで。
- No.11151 - [コメント元:11148] [リストへもどる ] soft