MOD関数は10進以外は使えない?

 投稿者:島村1243  投稿日:2009年10月12日(月)11時28分33秒
  十進BASIC-7.3.5を使わせて頂いています。
下記プログラムをツールボタンで複素数モードと2進モードに変更(特別な意味は
なし)してRUNしたら、螺旋軌道を描くボールの位置(丸印)と半径線の描画がさ
れませんでした。10進モードでは正常です。1000桁モードは「cos関数をサポート
しない」と言うメッセージが出ます。

ボール位置と半径線の描画タイミングは、MOD関数を使って判断しているので、この関数は10進モード専用関数かな?と思いましたが、そうなのでしょうか。

SET WINDOW -25,5,-15,15

SET POINT STYLE 4

!DRAW grid

LET ydo=-20

LET xdo=-60

LET zdo=75

LET hrad=PI/180

LET xrad=xdo*hrad

LET yrad=ydo*hrad

LET zrad=zdo*hrad

LET R=8

LET f=0.1

LET w=2*PI*f

LET vz=0.6



CALL henkan(10,0,0,xrad,yrad,zrad,x3_,y3_,z3_)

PLOT LINES:0,0;x3_,y3_

CALL henkan(-10,0,0,xrad,yrad,zrad,x3_,y3_,z3_)

PLOT LINES:0,0;x3_,y3_



SET LINE COLOR "red"

CALL henkan(0,10,0,xrad,yrad,zrad,x3_,y3_,z3_)

PLOT LINES:0,0;x3_,y3_

CALL henkan(0,-10,0,xrad,yrad,zrad,x3_,y3_,z3_)

PLOT LINES:0,0;x3_,y3_



SET LINE COLOR "blue"

CALL henkan(0,0,28,xrad,yrad,zrad,x3_,y3_,z3_)

PLOT LINES:0,0;x3_,y3_



SET LINE COLOR "green"

CALL henkan(r,0,0,xrad,yrad,zrad,x3_,y3_,z3_)

FOR t=0 TO 10 STEP 0.05

   LET x=r*COS(w*t)

   LET y=r*SIN(w*t)

   LET z=0

   CALL henkan(x,y,z,xrad,yrad,zrad,x3,y3,z3)

   PLOT LINES:x3_,y3_;x3,y3

   LET x3_=x3

   LET y3_=y3

NEXT T



SET LINE COLOR "black"

FOR t=0 TO 41 STEP 0.05

   LET x=r*COS(w*t)

   LET y=r*SIN(w*t)

   LET z=vz*t

   CALL henkan(x,y,z,xrad,yrad,zrad,x3,y3,z3)

   PLOT LINES:x3_,y3_;x3,y3

   LET x3_=x3

   LET y3_=y3

   LET cnt=MOD(t,0.4)

   IF cnt=0 THEN

      LET x=0

      LET y=0

      CALL henkan(x,y,z,xrad,yrad,zrad,x0_,y0_,z0_)

      PLOT LINES:x0_,y0_;x3_,y3_

      PLOT POINTS:x3_,y3_

   END IF

NEXT T

END



EXTERNAL SUB henkan(x,y,z,xa,ya,za,x3,y3,z3)

LET x1=x*COS(ya)+z*SIN(ya)

LET y1=y

LET z1=-x*SIN(ya)+z*COS(ya)

LET x2=x1

LET y2=y1*COS(xa)-z1*SIN(xa)

LET z2=y1*SIN(xa)+z1*COS(xa)

LET x3=x2*COS(za)-y2*SIN(za)

LET y3=x2*SIN(za)+y2*COS(za)

LET z3=z2

END SUB
 

Re: MOD関数は10進以外は使えない?

 投稿者:白石 和夫  投稿日:2009年10月12日(月)11時50分18秒
  > No.633[元記事へ]

2進モードで
FOR t=0 TO 41 STEP 0.05
とすると誤差が発生します。

  IF cnt=0 THEN
のところを
  IF ABS(cnt)<=0.01 THEN
と変えてみたらいかがでしょうか。

なお,2進モードでは,0.05,0.4のいずれも誤差を持ちます。
2進モードで誤差を避けたいときは,0.5,0.25,0.125,0.0625など,
分数にしたとき分母が2のべきになる数を選んでください。
 

Re: MOD関数は10進以外は使えない?

 投稿者:島村1243  投稿日:2009年10月12日(月)17時22分11秒
  > No.634[元記事へ]

白石 和夫さんへのお返事です。

> 2進モードで
> FOR t=0 TO 41 STEP 0.05
> とすると誤差が発生します。
>
>   IF cnt=0 THEN
> のところを
>   IF ABS(cnt)<=0.01 THEN
> と変えてみたらいかがでしょうか。
>
> なお,2進モードでは,0.05,0.4のいずれも誤差を持ちます。
> 2進モードで誤差を避けたいときは,0.5,0.25,0.125,0.0625など,
> 分数にしたとき分母が2のべきになる数を選んでください。

白石先生、ご教示有難うございました。
2進、複素数の両モードで、0.125以上にセットすると、丸と線はダブりますが描かれました。
セット値を更に小さくすると描画されない範囲が生じます。

この結果を見て、改めて10進モードの強力さ、十進BASICと命名した意味合いを実感し
ました。
 

Re: MOD関数は10進以外は使えない?

 投稿者:山中和義  投稿日:2009年10月12日(月)17時54分3秒
  > No.635[元記事へ]

島村1243さんへのお返事です。

> 2進、複素数の両モードで、0.125以上にセットすると、丸と線はダブりますが描かれました。
> セット値を更に小さくすると描画されない範囲が生じます。

他の言語などでは、2進計算ですので通常はこのようにコーディングします。
最後のFOR文の修正を掲載します。他の部分も同様です。
SET LINE COLOR "black"

FOR tt=0 TO 4100 STEP 5 !カウンタ変数は整数型とする ←←←←
   LET t=tt/100 !実際の値に換算する ←←←←

   LET x=r*COS(w*t)
   LET y=r*SIN(w*t)
   LET z=vz*t

   CALL henkan(x,y,z,xrad,yrad,zrad,x3,y3,z3)

   PLOT LINES:x3_,y3_;x3,y3

   LET x3_=x3
   LET y3_=y3

   LET cnt=MOD(tt,40) !←←←←
   IF cnt=0 THEN
      LET x=0
      LET y=0

      CALL henkan(x,y,z,xrad,yrad,zrad,x0_,y0_,z0_)

      PLOT LINES:x0_,y0_;x3_,y3_
      PLOT POINTS:x3_,y3_

   END IF

NEXT tt !←←←←
 

Re: MOD関数は10進以外は使えない?

 投稿者:SECOND  投稿日:2009年10月12日(月)18時54分39秒
  > No.633[元記事へ]

!2進レジスター・イメージの、step に出来ますか?誤差が消えます。

FOR t=0 TO 41 STEP 2^(-5 ) !0.05
  (
     )
   LET cnt=MOD(t, 2^(-5) *8 ) ! 1,2,3,,,8,,,
   IF cnt=0 THEN
 

Re: MOD関数は10進以外は使えない?

 投稿者:島村1243  投稿日:2009年10月13日(火)10時19分21秒
  > No.636[元記事へ]

山中和義さんへのお返事です。

> 他の言語などでは、2進計算ですので通常はこのようにコーディングします。
> 最後のFOR文の修正を掲載します。他の部分も同様です。
> FOR tt=0 TO 4100 STEP 5 !カウンタ変数は整数型とする ←←←←
>    LET t=tt/100 !実際の値に換算する ←←←←

山中さん、ご教示有難うございました。
カウンタ変数に正統的な型を使えば問題が無いということなんですね。
十進BASICは容易に扱えるので、基本がすっかり頭から抜けてしまいました。
 

Re: MOD関数は10進以外は使えない?

 投稿者:島村1243  投稿日:2009年10月13日(火)10時30分46秒
  > No.637[元記事へ]

SECONDさんへのお返事です。

> !2進レジスター・イメージの、step に出来ますか?誤差が消えます。

FOR文のSTEP値も2進イメージにしなければならないとは気付きませんでした。
MOD関数が挟まれているFOR NEXT文中の2行修正のみで問題解決しました。
SECONDさん、有難うございました。
 

戻る