UBASICバグ情報


第8.8F版での修正
・date関数の表示ミスを修正
・奇数長文字列+偶数長文字列が不正フォーマット(表示は正常)に  なっていたのを修正。
第8.8E版での修正
・有理数の max, min で分母が 0 になることがあったのを修正。
・time1000を 0:00:00 丁度に使うと DOS に戻ってしまったのを修正。
・重複した行番号があるファイルを読みこんだときに不適切なエラー メッセージが出たのを修正。
第8.8C版での修正
・input # の仕様変更
 アスキーファイルの読み込みを input # で行うと改行コードは入力中 に含まれなかったがこれを含むように変更した。ただし一行が長すぎて 途中までの場合は改行コードを含まない。
・0#i の仕様変更
 キーボードあるいはプログラムからの 0#i の入力を複素数であること を保持し 0+0#i と内部で表現していたが弊害があるので単に 0 とする ことにした。
・polyconv 関数の新設
 modulus=0 と modulus=素数 の多項式の間の変換関数。
・max, min 関数のバグ修正
 有理数と整数あるいは有理数と有理数を引数とする max, min の値が分 母をかけた値で与えられていた。
第8.8B版での修正
・ema 配列での block 命令が 65536 個を超える要素を扱う場合に効か なかった。
第8.8A版での修正
・かなり大きいバグ
 for - next 構文でループ変数の
(1) 初期値が 2^32+2^16 以上で増分が負の場合、あるいは
(2) 初期値が -2^32-2^16 以下で増分が正の場合
に増減が正しく行われなかった。
もっとも簡単な例をあげる。
(1)
10 S=2^32+2^16
20 for I=S to S-1 step -1
30 print I
40 next
run
4295032832
65535 正しくは 4295032831
OK
(2)
10 S=-2^32-2^16
20 for I=S to S+1
30 print I
40 next
run
-4295032832
-65535 正しくは -4295032831
OK
・UBASIC と共に配布している sample programs では問題なし。
・自作プログラムの点検法:ほとんどの場合次のどれかに該当して いてプログラムの内容を考察しなくても安全であることがわかると 思われる。これ以外の場合は上記(1),(2)に該当しないことをプロ グラムの内容に立ち入って調べなければいけない。
(a) I%, j% などの %付き変数(短変数)がループ変数ならば安全
(b) 0 以上の数から始まって step がない場合は安全
(c) 配列の index になっている場合は安全
問題ありと分かった場合は、残念ながら 8.8A 版で計算し直す必要 がある。
第8.89版での修正
 dos/v 版で gprint が文字を表示しないことがあったのを修正。
第8.88版での修正
 paint が暴走することがあったのを修正。
 IBM 互換機でグラフィックが CGA のもの(HP200LXなど)の専用版を  作成(UBCJ)
UBCONST7.DAT の最後のデータのミスで prmdiv 関数が余計な計算を していた(結果は正しい)のでそこを修正。
DOS/V 版でグラフィック・モードにおいて COSOLE 命令を実行すると パラメータによらずテキストモードに切り替えることにした(従来は パラメータがない場合のみ)。
第8.87版での修正
 ランダムファイルの添字を1次元から2次元に拡張。そのオプション を追加変更。
 ppmpxj.lzh パッケージの ppmpx2.ub が2台以上の機械で分散処理を させると同じデータばかりを集めてしまい素因数分解に失敗した。
第8.86版での修正
 関数 nxtprm の誤動作(8.85 のみ,8.84以前は正常)を修正。
第8.85版での修正
 乱数の系列が freeze-melt で初期化されてしまうのを修正。
 PC98, FMR 版で一行関数定義 def fn が働かなかったのを修正
第8.84版での修正
 外部配列が version9 で使えない、version8 で両辺に外部配列が 使われるとエラーで終了する、の2点を修正。
 dos/v 版で dot 関数が正常に働かなかったのを修正。
第8.83版での修正
 8.81版で高速化した多倍長の掛け算にバグがあったのを修正。
第8.82版での修正
 def fn 文(一行関数定義)をサポート。
 school モードでの小数の表示桁数が規定通りでなかったのを修正。
第8.81版での修正
 Karatsuba の方法で掛け算を高速化した。100桁までは変わらず、 1000桁では約2倍。
 整数の割り算の余りを @ に加えて mod も許容、表示は 普通は @ で school モード時は mod になる。
第8.7j版での修正
 ASCII ファイルの読み込みが遅かったのを改良。
第8.7i版での修正
 PC98版で起動時にタイマー割り込みでシステムスピードを計測してい たのを他プログラムとの競合を避けるため vsync 割り込みに変更。
第8.7h版での修正
 現在の point 値がファイルを作ったときの point 値よりも大きいと きに小数型の複素数データの読み取りエラーが起った(point が異なる 環境での小数のやりとりはできるだけ避けてください。現在でも pack したデータ中に小数があると変換されずおかしなデータとなります)。
 input をファイルにリダイレクトしていると freeze-melt 後、ファ イルエラーになることがあった。
第8.7g版での修正
 ファイルの open 命令に create オプションを追加。同じ名前のファ イルがあった場合に削除してから output で open する。
 circle 命令に楕円の描画を追加。二つの半径 rx,ry を括弧で囲む。
 HOME キーの働きを画面の左上隅への移動から同じ行の左端への移動 に変更。
 ファンクション・キー表示を変更。goto *ラベル, gosub *ラベル では goto *, gosub * を省略。ただし DOS/V 版のみ。
 DOS/V 版のグラフィックモードで color 命令を実行するとその後の cls 命令で画面が真っ白になるのを修正。
第8.7f2版での修正
 98版で vlist, vxref が漢字変数名に対して誤動作したのを修正
第8.7f版での修正
 98版の内部定数の変更(動作に影響なし)
第8.7e版での修正
 exp の引数の絶対値が 22713.0 程度以上になると誤った答えを返す ことがありました。
 asin, acos が +-1.0 でも答えを返すようにしました。
第8.7d版での修正
 機械語プログラムへの引数渡しで配列変数の番地を誤る場合がありま した。
第8.7c版での修正
 modpower(法多項式, n, 法多項式) でべき指数 n が 65536 以上の 場合に誤った答えを返していました。
 modpower(多項式, n, 多項式) がエラーになっていました。
第8.7b版での修正
 besseli, besselj 関数がネストする(引数の計算にも besseli, besselj が出て来る)場合に誤った結果を与えていました。
 関数およびサブルーチン内で print word, print point を実行する と暴走しました。
第8.7a版での修正
 512 byte 以上の文字列に対して member 関数が働きませんでした。
 PC9801版で copy キーによるハードコピーがとれなくなっていました。

第8.7a版での追加
 doscmd 単独では command.com をロードし起動するようにしました。
 FM-R版でもオンライン・ヘルプをサポートしました。
第8.79版での修正
 最大 word 数を 1 減らしました。理由は 32bit版においてべき乗計 算の結果が最大桁になるとき内部ワークエリアを破壊することがあった ためです。
第8.78版での追加
 ctrl+c での中断を禁止することができます。stop 0 で禁止、stop 1 で許可です。普通は許可になっています。

第8.78版での修正
 vxref, vlist がうまく働かないことがあったのを修正。
第8.77版での拡張
 ema 配列の添え字の上限を 2^16 から 2^32 に増やしました。ただし 32bit版のみです。

第8.77版での変更
 randomize 後の最初の乱数は捨てることにしました。

第8.77版での修正
 PC9801版で左カーソルキーおよび ctrl+s の入力もれを解消し ました。
 print, lprint のファイル出力でファイル名に漢字を使うと化けるこ とがあったのを修正。
第8.76版での修正
 PC9801版,FM-R版のグラフィック表示関係で window, mapx, mapy に ミスがありました。サンプルの plot2d が動きません。

第8.76版での変更
 DOS/V版のグラフィック命令で cls 3 をテキストモードで実行 するとグラフィックモードに移行していたのを止めました。
 DOS/V版の console 0,* 命令で最下行も用いることにしました。
第8.75版での修正
 多項式で係数が非常に小さい小数(=#eps)のときに (0.0)X でなく X と表示されることがありました。表示のみの問題で計算自体は正しく行 われています。
第8.74版での追加
 異機種での互換性を増すために sys 関数、カーソルキー関数 #up, #down,... などを新設しました。
 DOS/V 機でのグラフィックをサポートしました。PC9801版との違い などは UBVGA.DOC を見てください。
 print=print+"file" で指定の file の大きさが 0 の場合に書き込み なされませんでした。
第8.72版での修正
 ダイレクトモードで宣言された配列の扱いにミスがありました。 (別々に宣言したものが同じ領域を用いる、など)
 sinh, cosh 関数の合成が使うと間違った値を返していました。 ( sinh(cosh(x)) が cosh(cosh(x)) を返す、など)
 sinh(x), cosh(x) で x(の実数部)が負の場合には正にして計算 するように変更しました。(sinh(-x)=-sinh(x), cosh(-x)=cosh(x))
第8.71版での変更
 逆三角関数 asin, acos を追加しました。
 時間を 1/1000秒単位で測ることができるようになりました(表示は 1/1000秒ですが 1/100秒程度の精度しかありません)。 clr time と print time1000 で計測したい部分をはさんでください。
第8.65版までの変更
 floor, ceil 関数を追加しました。floor は int と同じです。 ceil(x) は x 以上の最小の整数を表します。

バグ
 EMA 配列の block operation にバグがまだ残っていました。

変更
 irnd の値は 0 から 32767 です。負の数はありません。また乱数の アルゴリズムを変更しました。
第8.64版までの変更
 8.6版で漢字の gprint がおかしくなっていました。
第8.63版までの変更
 小数の表示を school モードと同様に普通のものにしました。つまり  print 0.1 は 0.09999 ではなく 0.1 と表示します。ただし表示のみ であり内部ではやはり正確には 0.1 ではありません。そのため 0.1*100 の表示は 10.0 にはなりません。

バグ
 EMA 配列の大きさが 256KBytes を超えると値がおかしくなりました。
第8.61版までの変更
 アスキーファイルの restore がサポートされていませんでしたので 追加しました。
 open "A.UBD" for input ... のように拡張子が指定してある場合は すべてアスキーファイルとみなすことになっていましたが .UBD の場合 だけはシーケンシャルファイルとみなすように変更しました。
 and と or を通常のように演算子としても使えるようになりました。
   例: "a または b" を a or b と書ける(従来は or{a,b} )
第8.5版までの変更
 school モードを新設しました。これは学校教育用に適したいくつかの 異なった働きをするモードです。
(1) 小数の表示を普通のものにしました。
   例:print 0.1 は 0.09999 ではなく 0.1 とする。
(2) グラフィックのオリジナル座標の原点を左上でなく左下とする。
(3) 小数の精度を表示桁数に比べて大きくとっているので誤差が目立た ない。
第8.41版までの変更
 bit 演算関数を組込みました。bitand, bitor, bitxor, bitset, bitreset, bitreverse, bitcount
第8.40版までの変更
 富士通 FM-R シリーズでのグラフィックをサポートしました。
第8.31版までの変更
 modsqrt(A,P) の制限を取り除きました。
 整数、有理数の負の整数べき乗が実数になるのを有理数に変更しまし た。
第8.2D版までの変更
 素数を法とする平方根関数 modsqrt(A,P) を組み込みました。ただし 素数の大きさに制限があります。
NEC PC9801 以外の機種用の UBASIC でもファンクションキーおよ びいくつかの特殊キーが使えるようにしました。
 漢字の表示の乱れを解消しました。カーソルの移動等も漢字に対応し ました。
UBV, UBF でも拡張配列(EMA配列)が使えるようになりました。 EMSメモリを用います。EMSは必ず連続した4ページ=64KBytesでとって ください。PC9801以外では普通の設定でこうなります。使い方はPC9801 版の拡張配列と同様です。
 またPC9801版もUBではバンク切り替え式からEMSに、UB32でもプロテ クトメモリの直接アクセスからEMSに変更しました。ページフレームア ドレスは C000H にしてください。
 拡張配列は従来は局所変数にできませんでしたが今回からサブルーチ ンと関数の中で普通の変数と同様に dim できます。
for-next の繰返し回数の上限をこれまでの 2^16-1=65535 から 2^32-1 = 4294967295 に増やしました。
 実行の停止の方法を改良しました。従来は CTRL+C のみでしたが、 PC9801 では STOPキーでも可能でしかも CTRL+C では止まらないような 場合でも効きます。 UBV では Ctrl+Break です。 UBF では PF12 です。Ctrl+C は効きません。
メビウスの関数は mob と moeb の両方を許容します。 ただし表示は moeb になります。
第8.2A版までのBUG
 最小の小数(=#EPS)の巾乗に欠陥がありました。これ以外の数では問 題ありません。また積はもちろん正しく計算します。
 elseif の後の条件式が 0 で始まると入力できませんでした。
 peeks 関数がうまく働きませんでした。
modpow の引数に modpow が出てくると符号を間違える。例えば modpow(-2,modpow(2,3,5),5) は modpow(2,modpow(2,3,5),5) と同じに なります。
素数を法とする多項式の演算に動作不良がありました。modulus が 32768以上ですと結果が正しくないことがありました。
変数にプログラム名を代入してプログラムを load,run することがプ ログラム内では不可能でした(意味不明なエラーで止りました)。
実部が負の複素数の sqrt があまり良い値を与えませんでした。
file?(*) で * が負のときにも代入が許されておかしな結果になりま した。