2 BASICの計算機能

2.1 変数と数値式

2.1.1 数値式

 加減乗除の演算を,それぞれ,+,-,*,/で表します。
また,ベき乗の演算は,^という記号を用いて,
たとえば,23を2^3のように表します。
 異なる演算記号を含む式を書くと,最初にべき乗を実行し,
次に乗除算を実行して,最後に加減算を実行します。
同順位の演算は左から実行します。
 計算を実行してその結果を表示させるのにPRINT文を用います。

10 PRINT 2+3*4^2
20 PRINT 3/4*5
30 PRINT 2^4^5
40 END

 10行は2+3×42を計算します。  20行は3÷4×5を計算します。  30行は (24)5 を計算します。

2.1.2 かっこ(括弧)

 演算の優先順位を変更したいときは,括弧を用いることができます。括弧を2重,3重,・・・に用いることもできますが,{ }や [ ] を用いず,すべて ( ) を用います。
 また,負号で始まる式を計算式のなかに書くときは,その前後を括弧で括ります。

 
10 PRINT ((2+3)*4)^2
20 PRINT 3*(-4)
30 END

 10行は,{(2+3)×4}2を計算します。
 20行は,3×(-4)を計算します。

2.1.3 行番号

 プログラムの各行の左端の数字を行番号といいます。(仮称)十進BASICでは行番号を省くことができます。
 本手引きではJISとの整合性を保持する目的で行番号を記述しますが,(仮称)十進BASICでプログラムを作成する場合には,行番号を省くことを推奨します

2.1.4 変数

 BASICでは,コンピュータ内部の数値の記憶場所のことを変数といいます。変数は,A,B,Cなどの名前を付けて利用します。また,変数名には,LEFT,RIGHTなど,長い綴りを用いることもできます。変数名の付け方の詳細は,JIS規格を参照してください。
 英字は,大文字と小文字のいずれも使用できますが,対応する英字の大小の違いは無視されます。たとえば,Aとaは同じ変数を表します。
 変数に数値を記憶させることを代入といいます。変数に新たな数値を代入すると,それ以前に保持していた数値は消滅して参照できなくなります。
 変数に数値を代入するのにLET文を用います。

10 LET X=10
20 PRINT 2*X^2+3*X+4
30 END

 上の例のように,変数名を数値式で用いると,変数名はその変数に記憶されている数値を表します。
 LET文は,
 LET 数値変数名 = 数値
の形式で書きます。LET文が実行されると,右辺の値が計算されて左辺の変数名が示す変数に代入されます。

[Note] BASICでは,乗算の記号を省くことはできません。X*YのつもりでXYと書くと,XYは,XやYとは別の単一の変数と解釈されます。

問1 次のプログラムを実行すると結果はどうなりますか?

10 LET A=10
20 LET A=A+1
30 PRINT A
40 END

 (仮称)十進BASICには,ステップ実行の機能があります。 をクリックすると,一行ずつ実行するモードで実行を開始します。図のような画面が現れたら,Enterキーを押すか,Okボタンをクリックするごとに一行ずつ実行します。

Debugウィンドウには,これから実行する文と各変数の値が表示されます。一行実行するごとに変数の値がどのように変化するか調べてみてください。なお,Debugウィンドウ下部の矢印をクリックすると,履歴をさかのぼって見返すことができます。

2.1.5 INPUT文

 プログラムの実行時に変数に値を代入したいときにはINPUT文を用います。INPUT文では, INPUT に続けて数値を代入したい変数をコンマで区切って並べます。
 次のプログラムは,入力された2数の積を表示します。

10 INPUT A,B
20 PRINT A*B
30 END

 このプログラムを実行すると,図のようなダイアログが表示されるので,入力したい2数をコンマで区切って打ち込み,最後にEnterキーを押してください。

2.1.6 大きな数と小さな数

10 PRINT 1/7
20 END

を実行すると,

 .142857142857143

のように表示されます。このように,実行結果の絶対値が1より小さい場合には,小数点の左側の0を省いて表示されます。

 また,

10 PRINT 2^100,2^(-100)
20 END

を実行すると,実行結果は次のように表示されます。

 1.26765060022823E30   7.88860905221012E-31

 これらは,それぞれ,1.26765060022823×1030,7.88860905221012×10-31を表します。

2.2 PRINT文

2.2.1 文字列

 PRINT文を利用して文字列を表示することができます。文字列は,その前後を引用符(")で囲んで表します。

10 PRINT "ABC"
20 END

 10行を PRINT ABC とすると,数値変数ABCの値を表示するという意味になってしまいます。

[補足] 「"」は,Shiftキーを押しながら文字キーの上に並んでいる数字キーのうちから「2」のキーを押して入力します。

2.2.2 項目の区切り記号(コンマとセミコロン)

 PRINT文では計算結果を出力するときにその様式を制御することができます。そのうち,特に重要なものを説明します。

 PRINT文には,コンマまたはセミコロンで区切って複数の項目を書くことができます。項目の区切り記号にセミコロンを用いると,各項目は詰めて表示されます。項目の区切りにコンマを用いると,各項目は一定の桁位置まで空白を出力した後に出力されます。たとえば,

10 PRINT 3; 3^2, 1/3, 2*3
20 END

を実行すると,

 3  9                    .333333333333333        6 

のように表示されます。

 通常,PRINT文を実行すると,最後に改行します。改行したくない場合には,PRINT文の末尾にコンマかセミコロンを書いておきます。たとえば,

10 PRINT 1;2;3;
20 PRINT 4;5
30 END

を実行すると,

1  2  3  4  5 

のように出力されます。

 PRINT文には,出力項目を書かない特別な形式があります。このPRINT文は,改行させる働きを持ちます。たとえば,

10 PRINT 1/3
20 PRINT
30 PRINT 3^2
40 END

を実行すると

.333333333333333 

 9

のようになります。

2.3 FOR〜NEXT

2.3.1 FOR〜NEXT構文

 FOR〜NEXTはBASICの応用プログラムで頻繁に用いられる繰り返しの構文です。FORとNEXTは常に対にして用いられる命令で,FOR文に指定された変数の値を順に変化させながらFOR行とNEXT行にはさまれた各行を繰り返し実行させます。
 次に示すプログラムはn=1,2,3,…10に対してn2を計算して表示します。

例1

10 FOR n=1 TO 10
20    PRINT n,n^2
30 NEXT n
40 END

 例1では,まず,n=1に対して20行が実行され,次にn=2に対して20行が実行されます。次はn=3に対して20行を実行します。同様のことを順に繰り返して,最後にn=10に対し20行を実行して終了します。ステップ実行を選択して,変数の値の変化と実行順序を調べてみてください。


 FOR〜NEXTの性質をくわしく調べるために次のプログラムを実行してみてください。

例2

10 INPUT n
20 FOR k=1 TO n
30    PRINT k
40 NEXT k
50 PRINT "Last",k
60 END

 このプログラムを実行してnに10を入力してみると,50行のPRINT文を実行したときにはkの値が11になっていることがわかると思います。上のプログラムでは,最初,kに1が代入され,NEXT文を実行するごとにkの値に1が加算され,それがnより大きくなるとNEXT文の次に進むという動作をしています。
 それでは,nに0を入力するとどうなるでしょうか。この場合,30行は1回も実行されずに50行のみが実行されます。このときのkの値は1です。この場合は,kの値が最初からnより大きいので30行やNEXT文を実行せずに50行に進んでしまうのです。この性質は重要ですの覚えておいてください。

2.3.2 FOR〜NEXTの応用(数列の和,積)

 次のプログラムは自然数nをキーボードから入力すると12+22+32+…+n2を計算します。

例3

10 INPUT n
20 LET S=0
30 FOR k=1 TO n
40    LET S=S+k^2
50 NEXT k
60 PRINT S
70 END

 和は変数Sを用いて求めます。まず,20行でSに0を代入しておき,30〜50行で k=1,2,3,…,nについてSにk2を加算します。

 同様の手法が数列の積の計算に使えます。順列の数nPr(=n(n-1)(n-2)…(n-r+1))は次のように計算できます。

例4

10 INPUT n,r
20 LET p=1
30 FOR k=(n-r+1) TO n
40    LET p=p*k
50 NEXT k
60 PRINT p
70 END


[Note] (仮称)十進BASICでは変数の初期値は0ですが,JISの規定では変数の初期値は0でなくてもよいことになっています。したがって,互換性のあるプログラムを作るためには例3で20行を省略することはできません。

2.3.3 FOR〜NEXTの応用(漸化式で定義された数列)

 変数の値を順に更新していく手法を用いると,漸化式で定義された数列の計算ができます。
次のプログラムは,a1=5,an+1=3an+2 で定義される数列 {an} の第n項を計算します。

例 5

10 INPUT n
20 LET a=5
30 FOR k=2 TO n
40    LET a=3*a+2
50 NEXT k
60 PRINT a
70 END

 このプログラムはn=1の場合にも正しい答えが得られます。それは,kに2を代入した時点でkの値がnを超えているために,40行が1回も実行されないためです。

2.3.4 STEP

 FOR〜NEXT構文で繰り返しのたびごとに制御変数に加算される数値を1以外の数値にすることができます。次のプログラムでは,xの値を0から1まで0.1ずつ加算しながらx2を計算して出力します。

例 6

10 FOR x=0 TO 1 STEP 0.1
20   PRINT x,x^2
30 NEXT x
40 END


 また,数値を大きい値から小さい値へ変化させる目的でこの構文を用いることができます。

例 7

10 FOR k=10 TO 1 STEP -1
20   PRINT k
30 NEXT k
40 END


問 2 次のプログラムはnに偶数を入力することを想定しているように思えますが,奇数を入力しても動作します。どのように動作するのでしょうか。

10 INPUT n
20 FOR k=0 TO n STEP 2
30   PRINT k
40 NEXT k
50 END

2.4 DEF文

 FOR〜NEXTの機能を利用して関数値の表を作ってみましょう。次のプログラムは,関数f ( x ) = x3 -3x +1 についてxの値を-4から4まで0.1刻みで変化させて関数値を計算します。

例 8

10 DEF f(x)=x^3-3*x+1
20 FOR x=-4 TO 4 STEP 0.1
30    PRINT x,f(x)
40 NEXT x
50 END

 このプログラムを実行すると結果が図のように表示されますが,右端のスクロールバーをマウスで操作することで出力結果の全体を見ることができます。

 10行のDEF文は関数を定義する命令です。関数の名前の付け方は変数の場合と同様です。ただし,同じ名前を関数名と変数名とに用いることはできません。10行では,関数名としてfを用いています。関数名に続けて括弧を書き,括弧内に変数名を書きます。=に続けて括弧内に書いた変数を利用して計算式を書きます。左辺で括弧内に書いた変数は,プログラムの他の部分で用いる変数とは別の変数になります(つまり,数値の記憶場所が別)。

2.5 組込み関数

2.5.1 平方根,絶対値

 BASICでは, をSQR(x)のように書きます。また,xの絶対値 |x| はABS(x)で表します。
 [Note] SQRは,SQuare Rootの,ABSは,ABSoluteの略です。
 直角三角形の直角をはさむ2辺の長さがそれぞれa,bであるとすると斜辺の長さは です。a,bを入力して を求めるプログラムは次のようになります。

例9

10 INPUT a,b
20 PRINT SQR(a^2+b^2)
30 END

2.5.2 三角関数

 xの正弦(sine),余弦(cosine),正接(tangent)は,それぞれ,SIN(x),COS(x),TAN(x)を用いて求めることができます。角の大きさの単位は標準ではラジアンですが,
OPTION ANGLE DEGREES
をプログラムのはじめに書くことで角の大きさの単位を度(degrees)に変えることができます。次のプログラムは,余弦定理を用いて,三角形の2辺の長さa,bとそれらがはさむ角の大きさCを入力すると残りの辺の長さを答えます。

例 10

10 OPTION ANGLE DEGREES
20 INPUT a,b,C
30 PRINT SQR(a^2+b^2-2*a*b*COS(C))
40 END

2.5.3 逆三角関数

 余弦定理の式を変形すると,

となりますから,三角形ABCの3辺の長さa,b,cから頂角Aの大きさAを求めることができます。 cosAの値から,対応するAの値を求めるのに,BASICの組込み関数ACOS(x)を用いることができます。ACOS(x)は,0≦t≦180の範囲でcos t゚= xとなるtを求める組込み関数です。

例11 a,b,cを入力して,Aを求めるプログラム。

10 OPTION ANGLE DEGREES
20 INPUT a,b,c
30 PRINT ACOS((b^2+c^2-a^2)/(2*b*c))
40 END

 a=7,b=3,c=5を入力したときの実行結果を次に示します。

 ? 7,3,5
 120

同様の組込み関数にASIN(x),ATN(x),ANGLE(x,y)があります。
 ASIN(x)は,-90≦t≦90の範囲でsin t゚= xとなるtを求めます。
 ATN(x)は,-90<t<90の範囲でtan t゚= xとなるtを求めます。
 ANGLE(x,y)は,-180<t≦180の範囲で原点と点(x,y)を結ぶ線分がx軸の正の向きとなす角を求めます。

2.5.4 INT関数とMOD関数

 INT(x)はxを越えない最大の整数です。nが整数であればINT(n)はnと一致しますが,小数部を持つ場合には負の方向に切り捨てます。たとえば,INT(2.3)=2,INT(-2.3)=-3です。
 MOD(a,b)はaをbで割った余りです。MOD(a,b)=a-b*INT(a/b)で定義されています。たとえば,MOD(5, 3)=2,MOD(-4, 3)=2,MOD(1.3, 0.4)=0.1となります。
 b>0であれば,0≦MOD(a,b)<bとなります。b<0のときは,b<MOD(a,b)≦0です。

2.5.5 PI関数など

 BASICには特別な定数を表す組込み関数が用意されています。PIは円周率πの近似値です。MAXNUMはBASICで扱うことのできる最大の数です。

例12

10 PRINT PI, MAXNUM
20 END

2.5.6 乱数(RND関数)

 RNDは特殊な関数です。この関数は引数を持ちませんが,計算するごとに異なる値を返します。たとえば,次のプログラムを実行してみてください。

例 13

10 FOR k=1 TO 10
20 PRINT RND
30 NEXT k
40 END

 RND関数が返す数値のことを乱数といいます。RND関数は,0以上1未満の範囲で偏りなくでたらめな数値を発生させます。上のプログラムは実行するたびごとに同じ結果を返します。実行するごとに異なる系列の乱数がほしい場合には,次に示すように,RND関数を実行するまえにRANDOMIZE文を実行しておきます。
 RND関数をさいころの代わりに使うためには次のようにします。このプログラムでは,RNDの値を6倍して1を加え,整数部分を取り出すことで1から6までの整数が得られるようにしています。

10 RANDOMIZE
20 FOR n=1 TO 20
30     PRINT INT(RND*6+1)
40 NEXT n
50 END

2.6 グラフィックス

2.6.1 関数のグラフ

 グラフィック機能を利用すると関数のグラフを描くことができるようになります。

例14 -4≦x≦4,-4≦y≦4の範囲で関数y=x3-3x+1のグラフを描く。

10 DEF f(x)=x^3-3*x+1 
20 SET WINDOW -4,4,-4,4
30 DRAW GRID
40 FOR x=-4 TO 4 STEP 0.1
50    PLOT LINES: x,f(x);
60 NEXT x
70 END

 このプログラムを実行すると,図のような結果が得られます。結果が表示されるウィンドウでマウスカーソルを動かすとその点の座標が下欄に表示されます。

 描画に用いられる領域の形状は,縦横の長さが等しい正方形です。縦横のドット数は画面の大きさから(仮称)十進BASICが最適な大きさを選択しますが,メニューから選択して決めることもできます。
 20行のSET WINDOW文は,画面上の描画領域に,x座標の範囲が-4から4,y座標の範囲が-4から4となるような座標系を設定します。
 30行のDRAW文はgridを描きます。gridはJISには規定されていませんが,JISで規定される命令を組み立てて同様の機能を実現することができます。
 50行のPLOT LINES命令は,点(x , x3-3x+1)を順に結ぶ線分を描くことで関数のグラフを描くために用いられています。一般に,

     PLOT LINES: x , y ;

と書くと,次に実行されるPLOT LINES命令で指定される点との間が線分で結ばれます。

2.6.2 SET WINDOW

     SET WINDOW  x1 , x2 , y1 , y2

と書くと,描画領域の横方向に左端がx1 , 右端がx2 , 縦方向に下端がy1 , 上端がy2であるような座標系が設定されます。
 幾何学的な図形を描くような場合には x2 - x1 = y2 - y1 でないと具合が悪いのが普通ですが,関数のグラフのように縦軸と横軸が性質の異なる量を表す場合にはそうである必要はありません。たとえば,角の大きさの単位を度(°)にして正弦関数のグラフを描く場合には次のようにします。

例15

10 OPTION ANGLE DEGREES
20 DEF f(x)=sin(x)
30 SET WINDOW -360,360,-4,4
40 DRAW GRID(90,1)
50 FOR x=-360 TO 360
60    PLOT LINES: x,f(x);
70 NEXT x
80 END

10行のOPTION ANGLE DEGREESは,SIN関数が書かれる行よりも手前の行に書かなければなりません。
40行で用いているgrid(a,b)は,横軸方向a間隔,縦軸方向b間隔の格子です。

2.6.3 PLOT LINES

PLOT LINESは,指定された点を線分で結んで折れ線を描く命令です。点の指定は,x座標とy座標をコンマ(,)で区切って書きます。一つのPLOT LINES文に複数の点を指定することもできます。その場合,点と点はセミコロンで区切ります。また,点の並びの最後にセミコロンを書くこともできます。直前に実行されたPLOT LINES文がセミコロンで終わるものであった場合には,直前に実行されたPLOT LINES文で最後に指定された点と,最初に指定された点との間も線分で結ばれます。
たとえば,未だPLOT LINES文が実行されていないか,または,直前に実行したPLOT LINES文の末尾にセミコロンがなかったとき,

 PLOT LINES: x1 , y1 ; x2 , y2

を実行すると,2点(x1 , y1 ) , ( x2 , y2 ) を結ぶ線分が描かれます。これは,

 PLOT LINES: x1 , y1 ;
 PLOT LINES: x2 , y2

のように2文に分けて書くことができます。

 PLOT LINES文には,点の指定を持たない特別な形式があります。これは,直前に実行したPLOT LINES文がセミコロンであったときにその効果を取り消すために用いられます。たとえば,次のプログラムのように2つの関数のグラフを続けて描く場合に用います。

例16

100 DEF f(x)=x^2
110 DEF g(x)=x^3
120 SET WINDOW -4,4,-4,4
130 DRAW GRID
140 FOR x=-4 TO 4 STEP 0.1
150    PLOT LINES: x,f(x);
160 NEXT x
170 PLOT LINES
180 FOR x=-4 TO 4 STEP 0.1
190    PLOT LINES: x,g(x);
200 NEXT x
210 END

 170行のPLOT LINESがないと,2点(4,f(4)),(-4,g(-4))が線分で結ばれてしまいます。

2.6.4 媒介変数表示の曲線

 媒介変数方程式を用いて表された曲線を描くのは簡単です。次のプログラムは,曲線 x=3cos t , y=2sin t を描きます。

例17

10 OPTION ANGLE DEGREES
20 DEF f(t)=3*COS(t)
30 DEF g(t)=2*SIN(t)
40 SET WINDOW -4,4,-4,4
50 DRAW grid
60 FOR t=0 TO 360
70    PLOT LINES: f(t),g(t);
80 NEXT t
90 END

2.6.5 極方程式表示の曲線

 極方程式 r=f(θ)は,x=f(θ) cosθ, y=f(θ) sinθとすれば媒介変数形に直せます。
次のプログラムは,正葉線 r = sin 2θを描きます。
例18

10 DEF f(t)=SIN(2*t)
20 SET WINDOW -1,1,-1,1
30 DRAW grid
40 FOR t=0 TO 2*PI STEP PI/360
50 PLOT LINES: f(t)*COS(t), f(t)*SIN(t);
60 NEXT t
70 END

2.6.6 極座標

 BASICでは,直交座標から極座標への変換は簡単です。直交座標(x,y)に対する極座標を(r,θ)とすれば,r=SQR(x^2+y^2) , θ=ANGLE(x,y)となります。ただし,-π<θ≦πです。
 次のプログラムは,円 x=1+cos t,y=sin t 上を動く点Pの動径の長さを2乗し,偏角を2倍にした点の軌跡を描きます。
例19

100 SET WINDOW -4,4,-4,4
110 DRAW grid
120 FOR t=0 TO 2*pi STEP pi/180
130    LET x=cos(t)+1
140    LET y=sin(t)
150    LET r=x^2+y^2
160    LET a=ANGLE(x,y)*2
170    PLOT LINES: r*cos(a),r*sin(a);
180 NEXT t
190 END

2.6.7 SET LINE COLOR

 複数の曲線を同一の座標平面上に描く場合には曲線ごとに色を変えたくなるかも知れません。線の色を変える命令はSET LINE COLORです。色は番号で指定します。(仮称)十進BASICでは,通常,次のように各番号に対する色が割り当てられています。

0白, 1黒, 2青, 3緑, 4赤, 5水色, 6黄色, 7赤紫,8 灰色,9 濃い青, 10 濃い緑,11 青緑, 12 えび茶,13 オリーブ色,14 濃い紫,15 銀色,・・・
 たとえば,

  SET LINE COLOR 4

を実行すると,それ以後,線は赤で描かれます。

2.6.8 点を描く命令

 点を描きたいときには,まず,SET POINT STYLEを実行して点の形を指定します。点の形は次の番号で指定します。指定しないと3番の形が使われます。

 1 ・    2 +      3 *     4 ○       5 ×
 点の色はSET POINT COLORで変更できます。
 点を打つ命令はPLOT POINTSです。次の形に書きます。

PLOT POINTS: x,y

2.7 数値計算

2.7.1 平方根

 加減乗除の演算のみを用いて,正の数の平方根の近似値を求める方法を考えます。
 縦の長さがa,横の長さが1の長方形と面積の等しい正方形の1辺の長さがです。そこで,はじめの長方形を,面積を変えないようにして縦と横の長さが近づくように変形していけば,この長方形の辺の長さはに近づくはずです。
 変形して得られる長方形の縦の長さをもとの長方形の縦,横の長さの平均にとることにします。すなわち,第k回目に得られる長方形の縦,横の長さをそれぞれxk,ykとするとき,

とします。すると,この変形で面積を変えないという条件から,横の長さyk+1は,

として定められます。これらの関係式からxkのみの式を導くと,

となります。次のプログラムは,この数列 {xk} の第8項までを求めます。

例20

10 INPUT a
20 LET x=a
30 FOR n=1 TO 8
40     LET x=(x+a/x)/2
50     PRINT n,x
60 NEXT n
70 END

2.7.2 BASICの数値

 (仮称)十進BASICでは,数値は十進小数として表現されます。そして,正しい値が16桁の十進数で表現できるような演算の結果は正しい結果が得られます(保証はできませんが)。たとえば,SQR(36)の計算結果は正確に6になります。また,角の大きさの単位が度である場合には,SIN(30)の計算結果は0.5になります。しかし,計算結果の真の値が16桁の十進数で表現できないとき,その結果は近似値になります。たとえば,1/3の計算結果には誤差が含まれます。
 (仮称)十進BASICでは,数値変数は15桁の精度を持ちます。有効数字の桁数が15桁を越える数値を代入すると,有効数字が15桁になるように数値が丸められます。
 一方,数値式の計算結果は,16桁を越える精度を持ちます。たとえば,1/3の計算結果は,
0.333333333333333333333333333となって,有効数字が27桁あります。
 通常,PRINT文は有効数字が15桁になるように計算結果を丸めて表示しますが,オプションメニュー−数値で「表示桁数を多く」にチェックを入れると,十進モードではすべての桁を表示するようになります。

 数値式の桁数が数値変数の桁数より大きいのは日本工業規格(JIS)の規定によるものですが,ときとしてわかりにくい現象を引き起こします。たとえば,次のプログラムでは,20行の実行結果は0ではありません。これは,丸める桁数の相違によるものです。

10 LET A=1/3
20 PRINT 1/3-A
30 END

2.7.3 桁落ち

10 LET A=1/3
20 PRINT A-0.33333333333333
30 END

を実行すると,20行ではAの値が0.333333333333333になっているのですから,実行結果は .000000000000003 になります。けれども,10行で変数Aに代入した数値は1/3であると考える立場からすると,上の結果は有効数字が1桁になってしまったものといえます。
 BASICでは単一の計算の結果の正確さはJISによって保証されますが,少なくも一方の計算結果が15桁では正確に表現できない数値の引き算を行うと,その2数の値が接近している場合に著しく有効数字の桁数が減ってしまう現象が起こります。これを桁落ちといいます。
 関数y=f(x)のx=aにおける微分係数f'(a)は,増分hを限りなく0に近づけたときの平均変化率の極限で定義されます。次のプログラムは,f(x)=であるときにx=2における平均変化率がhの値を10-1,10-2, 10-3, 10-4,…, 10-15 と変化させたときにどう変化するか調べようとしたものです。hを0に近づけたときの極限は,理論的な計算ではおよそ0.353553390593274ですが,実行結果をみるとhが0に近づくとかえって正しい値から離れていってしまっています。これは,上に述べた減算に伴う桁落ちによるものです。

例 21

10 DEF f(x)=SQR(x)
20 FOR i=1 TO 15
30    LET h=10^(-i)
40    PRINT h, (f(2+h)-f(2))/h
50 NEXT i
60 END

実行結果

 .1                      .349241122458488 
 .01                     .35311255026876 
 .001                    .3535092074646 
 .0001                   .353548971286 
 .00001                  .35355294866 
 .000001                 .3535533464 
 .0000001                .353553386 
 .00000001               .3535534 
 .000000001              .3535534 
 .0000000001             .353554 
 .00000000001            .35356 
 .000000000001           .3536 
 .0000000000001          .354 
 .00000000000001         .36 
 .000000000000001        .4

2.7.4 円周率π

 直径1の円に内接する正n角形の辺の長さの和は ですから,正2k角形の辺の長さの和をakとすると,ak= となります。
 半角の公式から となるので,
cos90°,cos45°,…,,…
が順に計算できます。
の関係を利用すればakの計算ができるのですが,実際にはうまくいきません。
kが大きくなると, が0に近くなるので, は1に近くなります。
そのため,1- の計算で桁落ちが発生します。
 そこで,2倍角の公式を変形して得られる関係式

を用いて,
sin 90°,sin 45°,…, ,…
を計算することにします。
 cos 90°=0,sin 90°=1を出発点としてこれらの値を順に計算し,2kを出力するプログラムを作ると次のようになります。

例 22

10 LET c=0      ! cos 90°
20 LET s=1      ! sin 90°
30 FOR k=2 TO 30
40    LET c=SQR((1+c)/2)
50    LET s=s/c/2
60    PRINT 2^k,2^k*s
70 NEXT k
80 END

2.7.5 PRINT USING

 PRINT文に書式指定を書くことができます。次の形式で書きます。
PRINT USING 書式指定文字列: 数値式,数値式,…,数値式
書式指定文字列には,出力しようとする数値式の個数分の書式を含めます。書式と書式の間は空白文字など書式文字以外の文字で埋めてください。書式指定文字列の前後は引用符(")で括ります。書式を指定すると,小数部は指定された桁数に合わせて四捨五入されます。
 書式は,次の形式を推奨します。書式文字の詳細はJISを参照してください。

  正の整数                  #######         桁数分の#を書く。右詰めで表示される。
  整数(負数にも使える)      -------%        桁数分の負号,最後に%。
  正の小数                  #######.####    整数部,小数部をそれぞれ#で示す。
  小数(負数にも使える)      -------%.####

 書式を作成するとき,整数部の桁数が不足しないように注意してください。特に,負数の場合,負号を出力する分の桁の確保を忘れないように。

例23

10 FOR i=0 TO 17
20    LET n=10^i
30    PRINT USING "###################  #.##############":n,(1+1/n)^n
40 NEXT i
50 END

実行結果

                  1   2.00000000000000
                 10   2.59374246010000
                100   2.70481382942153
               1000   2.71692393223589
              10000   2.71814592682522
             100000   2.71826823717449
            1000000   2.71828046931938
           10000000   2.71828169254497
          100000000   2.71828181486764
         1000000000   2.71828182709990
        10000000000   2.71828182832313
       100000000000   2.71828182844545
      1000000000000   2.71828182845769
     10000000000000   2.71828182845891
    100000000000000   2.71828182845903
   1000000000000000   2.71828182845904
  10000000000000000   2.71828182845905
 100000000000000000   2.71828182845905

例24

10 FOR x=3.14159265 TO 3.14159266 STEP 0.000000001
20    PRINT USING "%.#########  ---%.###############":x,SIN(x)
30 NEXT x
40 END

出力結果

3.141592650     0.000000003589793
3.141592651     0.000000002589793
3.141592652     0.000000001589793
3.141592653     0.000000000589793
3.141592654    -0.000000000410207
3.141592655    -0.000000001410207
3.141592656    -0.000000002410207
3.141592657    -0.000000003410207
3.141592658    -0.000000004410207
3.141592659    -0.000000005410207
3.141592660    -0.000000006410207


次に進む

戻る