実数の加減算
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