* HSP 2.x 用の旧いコンテンツです
dim sin, 1025 ; テーブル用配列 sin.256 = 1024 sin.768 = -1024 repeat 256 r = cnt << 23 / 166886 ; ラジアンに変換 sin.cnt = r*r>>10*r>>13/3*r>>15*r>>17/5+r-(r*r>>10*r>>17/3)-(r*r>>10*r>>13/3*r>>15*r>>13/5*r>>13/6*r>>17/7)+4>>3 ; 位相をずらしてコピー a = 512 - cnt sin.a = sin.cnt a = 512 + cnt sin.a = -sin.cnt a = 1024 - cnt sin.a = -sin.cnt loop screen 0, 1024, 512, 1 repeat 1024 ; 波形を表示 line cnt, (sin.cnt + 1024) / 4 loop stop
screen 0, 512, 512
; さっきの sin テーブル計算ルーチン
dim sin, 1025
sin.256 = 1024
sin.768 = -1024
repeat 256
r = cnt << 23 / 166886 ; ラジアンに変換
sin.cnt = r*r>>10*r>>13/3*r>>15*r>>17/5+r-(r*r>>10*r>>17/3)-(r*r>>10*r>>13/3*r>>15*r>>13/5*r>>13/6*r>>17/7)+4>>3
; 位相をずらしてコピー
a = 512 - cnt
sin.a = sin.cnt
a = 512 + cnt
sin.a = -sin.cnt
a = 1024 - cnt
sin.a = -sin.cnt
loop
; line の中心座標
cx = winx/2
cy = winy/2
repeat
; マウス座標と中心座標の差
v1 = mousex - cx
v2 = mousey - cy
; ここから アークタンジェントを求める
; 入力 x, y = v1, v2
; 出力 atan
; 場合わけ
if v1 + v2 > 0 {
if v1 > v2 {
x = v1
y = v2
a = 1
c = 0
} else {
x = v2
y = v1
a = -1
c = 256
}
} else {
if v1 < v2 {
x = -v1
y = -v2
a = 1
c = 512
} else {
x = -v2
y = -v1
a = -1
c = 768
}
}
; 二分探索でアークタンジェントを求める
if x {
alp = 128
bet = -128
repeat 8
ctr = alp + bet / 2
tx = ctr + 256 & 1023
ty = ctr & 1023
if sin.ty<<10/sin.tx >= (y<<10/x) {
alp = ctr
} else {
bet = ctr
}
loop
atan = alp * a + c & 1023 ; 出力値
}
; 解が求められない場合
else {
atan = 0
}
; 描画
redraw 0
palcolor 255:boxf
color
x = atan + 256 & 1023
y = atan
line sin.x/4+cx, sin.y/4+cy, cx, cy
redraw
wait 1
loop
a = 49 ; 平方根を求める数 r = 0 repeat 15 ; 平方根を求める ;出力の最大値:32767 (15bit) b = 16384 >> cnt | r if b * b <= a : r = b loop mes "√"+a+" = "+r ; 計算結果 stop
#module ; sqrt (結果が代入される変数), (ルートを求める正の数値) #deffunc sqrt val, int mref v1, 16 mref v2, 1 v1 = 0 repeat 16 a = $8000 >> cnt | v1 if a * a <= v2 & (a <= 46340) : v1 = a loop return #global randomize repeat 24 * 4 rnd a, 2000 : rnd a, a + 1 sqrt b, a * 1000 * 1000 c = b \ 1000 : str c, 3 b = b / 1000 pos cnt / 24 * 160, cnt \ 24 * 20 mes "√"+a+" = "+b+"."+c loop stop
; 三乗根
#deffunc cbrt val, int
mref v01, 16
mref v02, 1
v01 = 0
repeat 11
a = 1024 >> cnt | v01
if a * a * a <= v02 & (a <= 1290) {
v01 = a
}
loop
return
#module ; push (入力する値) #deffunc push int mref v1 stack++ stack.stack = v1 return ; pop (値を取り出す変数) #deffunc pop val mref v1, 16 v1 = stack.stack stack-- return #global a = 100 ; 元の値 b = 200 push a ; a の値をスタックに待避 push b ; b の値をスタックに待避 a = 0 ; 値を破壊してみる b = 0 pop b ; スタックに待避していた値を取り出す pop a mes a ; ほうら、元通り mes b stop
|
|