コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

実数の加減算

IchigoJamを一日触って、IchigoJamを体験するのとBASICのリハビリも兼ねて、プログラムを作ってみました。IchigoJamで実数計算をします。
とりあえず、一日かけて作成したプログラムを置いておきます。
たぷん、何をしているか、コメントも何も書いていないので、まったくわからないと思います。すいません。

IchigoJamプログラム

全てのプログラムを保存し終わった後、load 0してください。
そして、[99]=10としてください。
加減算を行いたい値を配列[0][1][2]と[3][4][5]に入力してください。

配列[0]→指数、[1][2]には4桁の数値をいれます。
2.3456789E1を入力したいときには、let [0],1,2345,6789 とします。
-2.3456789E1を入力したいときには、let [0],1,-2345,6789 です。
-2.3456789E-5は、let [0],-5,-2345,6789 です。
[3][4][5]も同様です。

下記は 100 - 10 = 90 を計算する例です。

[99]=10
OK
let [0],2,1000,0000:let [3],1,-1000,0000
OK
run
(1.0000000E2)+(-1.0000000E1)= 9.0000000E1
OK

プログラム 0です。save 0して保存してください。

1 goto[99]
10 'let [0],2,1087,5420
20 'let [3],1,1234,5678
30 ?"(";:[94]=0:[100]=200:[99]=40:[98]=0:lrun 2
40 ?")+(";
50 [94]=3:[99]=60:lrun 2
60 ?")= ";
70 w=0:v=3:[86]=80:goto 200
80 [94]=0:[100]=200:[99]=90:[98]=0:lrun 2
90 ?:[99]=10:end
200 [100]=500:[99]=210:[98]=0:lrun 2
210 [85]=[w]-[v]:if [85]>8 else goto 250
220 if f<0 then [w+1]=-[w+1]
230 goto [86]
250 if(f=1)+(f=-2)else goto 430
260 if[85]<4 else goto 310
270   q=[85]:gosub 700
280   m=[w+2]+([v+1]%r)*(10000/r)+[v+2]/r
290   l=[v+1]/r
300 goto 340
310   q=[85]-4:gosub 700
320   m=[w+2]+[v+1]/r
330   l=0
340 [w+2]=m%10000
350 if m>9999 then m=1 else m=0
360 [w+1]=m+[w+1]+l
370 if [w+1]>9999 else goto 410
380   [w+2]=[w+2]/10+([w+1]%10)*1000
390   [w+1]=[w+1]/10
400   [w]=[w]+1
410 if f=-2 then [w+1]=-[w+1]
420 goto [86]
430 [100]=200:[99]=440:[98]=0:lrun 1
440 goto [86]
700 r=1:if q=0 then return else for p=1 to q:r=r*10:next:return

プログラム 1です。save 1して保存してください。

100 goto[100]
110 lrun[98]
200 [70]=[w+1]:[71]=[w+2]:[72]=0:[73]=0
210 if[85]<4 else goto 240
220   q=[85]:gosub 700
230   [74]=[v+1]/r:[75]=([v+1]%r)*(10000/r)+[v+2]/r:[76]=([v+2]%r)*(10000/r):[77]=0
240 goto 270
250   q=[85]-4:gosub 700
260   [74]=0:[75]=[v+1]/r:[76]=([v+1]%r)*(10000/r)+[v+2]/r:[77]=([v+2]%r)*(10000/r)
270 m=0:for z=3 to 0 step -1
280   [70+z]=[70+z]-[74+z]-m
290   if [70+z]<0 then [70+z]=10000-[70+z]:m=1 else m=0
300 next
310 n=0:for z=0 to 7
320   if [70]/1000>0 then z=7:goto 380
330   [70]=([70]%1000)*10+[71]/1000
340   [71]=([71]%1000)*10+[72]/1000
350   [72]=([72]%1000)*10+[73]/1000
360   [73]=([73]%1000)*10
370   n=n+1
380 next
390 if n=8 then [w]=0 else [w]=[w]-n
400 [w+1]=[70]:[w+2]=[71]
410 if f=-1 then [w+1]=-[w+1]
420 goto 110
700 r=1:if q=0 then return else for p=1 to q:r=r*10:next:return

プログラム 2です。save 2して保存してください。

100 gosub[100]
110 lrun[98]
200 for y=0 to 1
210   [93]=[y+[94]+1]
220   if[93]<0 then ?"-";:[93]=-[93]
230   for z=3 to 0 step -1
240     q=z:gosub 700
250     ?[93]/r;
260     [93]=[93]-([93]/r)*r
270     if(z=3)&(y=0)?".";
280 next:next
290 if[[94]]<>0?"E";[[94]];
300 return
400 [92]=0:if([90]>8)+([90]<=0)then return
410 if [90]<=4 then [92]=[[91]+2]:q=[90]-1 else [92]=[[91]+1]:q=[90]-5
420 gosub 700:[92]=([92]/r)%10
430 return
500 h=0:f=0
510 if[w+1]<0then h=h+1:[w+1]=-[w+1]
520 if[v+1]<0then h=h+10:[v+1]=-[v+1]
530 for g=0 to 2
540   if[w+g]>[v+g]else goto 580
550     if h=1 then f=-1
560     if h=10 then f=0
570     g=2:goto 630
580   if[w+g]<[v+g]else goto 630
590     for s=0 to 2:t=[w+s]:[w+s]=[v+s]:[v+s]=t:next
600     if h=10 then f=-1
610     if h=1 then f=0
620     g=2
630 next
640 if h=11 then f=-2
650 if h=0 then f=1
660 return
700 r=1:if q=0 then return else for p=1 to q:r=r*10:next:return