上の実験はインタプリタではしてないですが。起動メッセージが同じなので。日付は少し違いますね。1「妙だな」というのは、どこぞの小学生のよく言うせりふですが、それはさておき。#11164にも書きましたが、N88だと単精度でも倍精度でも上限は同じです。演算速度が単精度の方が速いという理由から私は全て単精度でやっているのですが、konnoさんが倍精度を選ばれている理由は何ですか?他のBASICだと上限が違うとかあるのでしょうか。私のコードでは全て単精度でやっています。精度変換の問題は出ないはず。実際、うちでは問題が出ていません。#11173では、同じコードで問題が出ているということです。これは精度変換の問題ではないと思われます。表示されず、正常になりました。両方でカウント処理が発生します。ループにしたほうがいいような気がします。想像ですが、例えば比較計算は倍精度で、表示は単精度に丸められているとか。N88のマニュアルでは、異なる型同士での演算の場合は高い精度のほうに合わせて行われるとのこと。これは比較演算でも同じはず。私の疑っていた、konnoさんのところのコンパイラとインタプリタのバージョン違いという疑いは晴れたので、するとあとは、私のところのバージョンとkonnoさんのところのバージョンが異なる、という問題は残ります。出発点は#11173。同じコードなのに結果が異なる、ということ。あ、重要な問題がある。私がもしかしたら、アップしたのとは異なるコードを実行していた可能性。実はこの可能性が一番高いかも。#11164にも書きましたが、N88だと単精度でも倍精度でも上限は同じです。FOR文のカウントに倍精度が使えない制限があるようです。それで単精度でやったら問題が出たので、倍精度でやり直してみたという経緯です。私のコードでは全て単精度でやっています。実際、うちでは問題が出ていません。#11173では、同じコードで問題が出ているということです。これは精度変換の問題ではないと思われます。特定のバージョン(V6.0)の問題なのではないかと疑っています。98エミュの問題の可能性も排除できないので実機で確認したいのです。表示されず、正常になりました。両方でカウント処理が発生します。ループにしたほうがいいような気がします。入れ子は特に間違えやすいので、FOR文でやりました。結果は同じになると思います。これは比較演算でも同じはず。それで謎の挙動がわかったような気がします。比較の実験結果をあげてみます。FOR文のカウントに倍精度が使えない制限があるようです。これはマニュアルにも明記されている仕様です。それで単精度でやったら問題が出たので、倍精度でやり直してみたという経緯です。いきさつが理解できました。特定のバージョン(V6.0)の問題なのではないかと疑っています。現時点では、私もこの線が濃厚だと思っております。入れ子は特に間違えやすいので、FOR文でやりました。BASICを極めたいのならWHILEは避けて通れません。私もかなり錆付いてはいますが、まだkonnoさんより私のほうが、BASICに関しては一日の長がありそうな感じ。結果は同じになると思います。いや、結果の問題ではなく速度の問題。加算するのはループカウンタだけでいいでしょう、ということです。ソースはこれだけです。うまく使ってシンプルでエレガントですね。合成数にすればよかったのかな。ソースはこれだけです。MODって関数なんですね。N88-BASICでは演算子なんですけどね。これをそのままN88-BASICに移植すると、こんな感じかなぁ。実行していないので、そのまま動くかどうかはわかりません。END解説すると・MODは演算子に変更した。・110行目のTHENの行番号は省略できたかもしれない。NULLの行番号が許容されるのなら、その場合は単に次の行に制御が移る。・ループの脱出条件が複数あるので、FORループからWHILEループに変更した。TurboBasicって、MOD関数またはMOD演算子ってないんですか?あと、NEXTの後ろの変数って省略できないんですか?でもコンパイラ言語だからあんまり関係ないのか。8ビットのBASICのころは、NEXTの後ろの変数を省略するとマイクロ秒の単位で速くなると信じられていて、だから私も省略するのが癖になっているのですよ。高速化といえば、最初のFORの直下のIF文。これはループの中に入れておくのはもったいない。1回しか比較する必要がないものを何回も比較することになるわけだから。こんな感じで十分だと思う。MODって関数なんですね。N88-BASICでは演算子なんですけどね。演算子でしたね、失礼しました。これをそのままN88-BASICに移植すると、こんな感じかなぁ。実行していないので、そのまま動くかどうかはわかりません。ありますが、32767以上は駄目みたいです。コンパイラ言語だからあんまり関係ないのか。省略できると思います。指定した方がわかりやすいと思うので。なると信じられていて、だから私も省略するのが癖になっているのですよ。コンパイラ言語ではあんまり関係ないのかもしれないなと思います。高速化といえば、最初のFORの直下のIF文。これはループの中に入れておくのはもったいない。1回しか比較する必要がないものを何回も比較することになるわけだから。FOR文はいらなかったですね。うっかりしていました。ソースから切り貼りしたのをそのまま残してしまったのかなぁ。演算子でしたね、失礼しました。関数になっていますよね。いうことは、十進BASICでは関数である、ということだと思いますが?もしかしたら演算子にもあるかもしれませんけどね。ありますが、32767以上は駄目みたいです。N88-BASICのリファレンスでは、演算前に小数点以下は切り捨てられるとはありますが、上限については記載がありません。試してみたいところではあります。関数になっていますよね。したら演算子にもあるかもしれませんけどね。あうう、キチンと読んでいませんでした。私がまた間違った言い方をしてしまったのかと。ありますが、32767以上は駄目みたいです。上限については記載がありません。試してみたいところではあります。TurboBasicでテストプログラムを作ってみました。タイマーで計算がバグって困ってたんですが、これが原因だったようです。テストプログラム作成は無駄ではなかった。オーバーフローエラーになりました。N88BASICでは行番号が必要で、タブは使えなかったので以下のようにプログラムを修正しました。使うのが良いのでしょうね。以下のようにプログラムを修正しました。うわぁ、ものすごく違和感がある見た目のプログラムになるんだな。最大の理由は、おそらく、行番号のあるBASICにもかかわらず、コードが小文字だというところからくるものだと思います。行番号の不要なBASICなら小文字のコードでも全く違和感は感じないんですけどね。完全に、行番号のあるBASICは大文字、という感性に毒されている模様。あと、もしかしたら些細かもしれないけど、行番号が等間隔ではないところにも、まぁまぁ違和感を感じる。行番号の振り直しには手間がかかりますので、ある程度は仕方ないか。ここで、行番号に関する昔話でも。日本では、8ビットパソコンの草創期から、BASICのリストでは、行番号は10から始まって10番ごと、というのがデファクト。10番ごとかというと、コードの追加をする場合、その間の番号が使えるから、ということのようです。これは、日本にBASICがやってくる前から、そういうのが普通だったらしい。コードを追加すると当然、それは10番ごとにはならない。そこで、BASICインタプリタにはRENUMというコマンドが用意されました。renumberの略で、要するに行番号を振りなおしてくれるわけです。これはNECのBASICにもシャープのBASICにもあったので、おそらく、東芝のBASICにもあったのではないかなぁ。どこのものもほとんど同じだと思いますが、NECの場合はデフォルトで、新しく付け直した行番号の開始番号は10からで、間隔も10ごとに付け直してくれました。コンパイラの場合は当然、こういう便利な機能があるわけではありませんから、番号の振り直しは自前で人間がやらなければならないので、いろいろと面倒。その後、BASICでもループなどをきちんとインデントするのが当たり前の時代になると、ここで問題になったのが、行番号の桁数。インデントを整えても、90から100とか、990から1000といった行番号の桁数が変わるところでインデントが崩れてしまう。そこでどうするかというと、例えば990行までに収まらないプログラムなら1000行からはじめればよい、ということになりました。この部分、私ならなにも10番間隔にこだわらず5番間隔でもいいじゃないか、それこそ最終的な完成形はもうこれ以上追加削除をしないということを強調する意味で1番間隔でいいのではないか、と思うのですが、どうも世の中の大勢は10番間隔が好きみたい。あと、間隔はいくつでもいいのですが、プログラムの最初から最後まで等間隔は守るべき、というのも世間の多数派のようです。いうか、RENUMコマンドを使えば必然的に等間隔になるわけです。ここで例えば、いろいろとコードを追加した際にその部分を追加したということを目立たせるためにあえて残すべき、という流派の人もいたらしいですが、これはその後、少数派になりました。当時のBASICの編集画面だと、最近のテキストエディタと違い、それが何行目かということが表示されないわけです。あれば、もし10番ごとの等間隔なら、ジャンプの飛び先はプログラムリスト上で60行先になるわけで、プリントアウトされた紙で追いかけやすい、という実利的な理由があったわけです。BASICのプログラムをインタプリタに読み込ます機会があったら、RENUMコマンドをかけた結果を保存しておくべきでしょう。うわぁ、ものすごく違和感がある見た目のプログラムになるんだな。いうところからくるものだと思います。言われればそんな感じもしますが、私はもう気にしてなかったので。行番号の不要なBASICなら小文字のコードでも全く違和感は感じないんですけどね。完全に、行番号のあるBASICは大文字、という感性に毒されている模様。私はbasic歴が長いので、他の言語が小文字なのに違和感を感じました。そこで、BASICインタプリタにはRENUMというコマンドが用意されました。renumberの略で、要するに行番号を振りなおしてくれるわけです。あったのではないかなぁ。10ごとに付け直してくれました。開始行番号は、新しくつける先頭の行番号の数値を指定します。旧行番号は、付け替える初めの行を指定します。私は使ったおぼえが無いですね。試したことはあるかもですが。私の場合、行番号を振り直すと逆に頭の中のソースのイメージが壊れて混乱してしまう気がしたので使わなかったのかもですね。再印刷もなかなか出来なかったし。ここで問題になったのが、行番号の桁数。1000行からはじめればよい、ということになりました。これ、私はインデントなどしてなかったので、全く気になりませんでしたね。10番から付けてしまったのです。必然的に等間隔になるわけです。人もいたらしいですが、これはその後、少数派になりました。私は少数派のようですね。いうことが表示されないわけです。私がNCプログラムを書いていた当時は、紙にプログラムを手書きしてからタイプライタに打ち込む形でした。それが面倒に感じたのでパソコンに直接打ち込むスタイルを私が始めたのです。していたかもしれません。私にとっては行番号は飾りでした。偉い人にはそれがわからんのですよ。それで狭い画面で行番号を頼りに確認するのが煩わしくて、スクリーンエデイタを欲したのです。当時スクリーンエデイタといえば、ワードマスターとか10万以上もするようなのしか無かったと思います。それで、結局自作のBASICインタプリタ用スクリーンエデイタもどきを作ったのでした。そのために買ったのが、パソピア7だったという。VZエデイタが出てきたのでした。かけた結果を保存しておくべきでしょう。その機会があればやってみたいと思います。動かないみたいですが、これがインタプリタなのですよね。私はbasic歴が長いので、他の言語が小文字なのに違和感を感じました。私もBASIC歴はそれなりに長いのですがね。複数言語に触れたというのが大きな違いでしょうか。これはN88-BASICでもN-BASICでも同じです。私は使ったおぼえが無いですね。試したことはあるかもですが。ここは逆というか、私は使いまくりでした。便利に使っていたのが、GOTOの飛び先の行番号が実在しないときにはエラーを表示してくれる機能。行の追加・削除を頻繁に行う場合には、これは必須というくらいに便利でした。気がしたので使わなかったのかもですね。再印刷もなかなか出来なかったし。(^^;この辺はよく理解できない。いうことは、私の場合はあまり行番号に依存しないでソースをイメージしていたのかな。私にとっては、行番号なんて単なる飾りだった、とか。これ、私はインデントなどしてなかったので、全く気になりませんでしたね。10番から付けてしまったのです。(^^;ここは私にとって大きな違い。BASICでもバグの入りにくいコードを書こうと思っていたのでインデントしまくり。私は少数派のようですね。(^^;別に少数派だからといって恥じる必要はさらさらありませんけどね。多数派の言い分としては、そちらのほうがバグ取りがしやすい、というもの。実際、私の経験からも、多数派のほうが正しそうな気がする。いうことで、バグ取りに悩まされたくないので、私も行番号をそろえていました。実利優先、ということで。別に少数派だからといって恥じる必要はさらさらありませんけどね。多数派の言い分としては、そちらのほうがバグ取りがしやすい、というもの。実際、私の経験からも、多数派のほうが正しそうな気がする。いうことで、バグ取りに悩まされたくないので、私も行番号をそろえていました。実利優先、ということで。考えてみたら行番号必須のBASICインタプリタはプログラム言語全体では少数派なんですよね。行番号付きのBASICインタプリタは作ったその場ですぐ実行できる初心者向きのお手軽な言語だと思います。今でも教育用には使われているのでしょう。本格的なプログラム言語には行番号は無いので、ラベルでジャンプしますよね。いうことで、N88BASICなどと共用する場合を除いて行番号は無くす方向で行きたいと思います。インデントは読みやすくなるのでなるべく心がけるようにします。1お彼岸の墓参りの相談で実家に顔を出してきました。その折に、30分ほどですが、PC-98に触れて。これをそのままN88-BASICに移植すると、こんな感じかなぁ。実行していないので、そのまま動くかどうかはわかりません。このくらい当たり前、というかもしれませんけどね。・110行目のTHENの行番号は省略できたかもしれない。NULLの行番号が許容されるのなら、その場合は単に次の行に制御が移る。あ、ここが省略できるかは確認してこなかった。次に行ったときには確認してこよう。いいつつ、忘れそうだけど。次の週末、金曜日から土曜日にかけて実家に泊まることになったので、それまでにはprime2.basのN88-BASICへの移植を終わらせたいなぁ。さんへのコメント宿直の際にものすごく多忙で。1時間半ぐらいしか仮眠を取れなかったのですが、帰宅後すぐに実家から墓参り。墓までの往路はいささか危なかったのですが、それでもおおむね安全運転。墓掃除その他もろもろですっかり眠気は取れて、実家への復路はほぼ問題なし。それはさておき、現在、実家です。・110行目のTHENの行番号は省略できたかもしれない。あ、ここが省略できるかは確認してこなかった。省略できることを確認しました。これでまた少しコードサイズが節減。