〜 ナンバー 〜
平方根を算出

HSP2では平方根を算出することができませんので、
求根アルゴリズムの1つであるニュートン法(ニュートン・ラプソン法)を使って
整数の範囲のうち、正の値でかつ、ニュートン法で取得できる場合は整数部のみを返すようにしています。
つまり、ルート1〜2,147,483,646は取得でき、それ以外は0を返すようにしています。
4バイト整数の最大値である2,147,483,647は内部で使用しているため、取得できません。
HSP3は元々sqrt関数があるので、下記のHSP3用は確認用または整数で受け取る程度のものです。
	

sqrt ルート
ルートルート値を指定する。
尚、2乗するとルート値になる元の値は整数の範囲でstatに返される。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#module
#deffunc sqrt int
	mref value
	mref stt, 64
	if value >= 0x7FFFFFFF | (value <= 0) : stt = 0 : return
	i = value + 1 / 2
	repeat
		i.1 = i.0
		i.0 = value / i.0 + i.0 / 2
		if i >= i.1 : break
	loop
	stt = i - (i > i.1)
	return
#global

	randomize
	repeat 120
		rnd x, 1000
		x = x + 1 * cnt
		sqrt x
		pos cnt / 24 * 130, cnt \ 24 * 20 : mes "√" + x + " = " + stat
	loop
	stop

元の値 = sqrt2(ルート)
元の値2乗するとルート値になる元の値の受取先を指定する。
ルートルート値を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#module
#defcfunc sqrt2 int value, local i
	if value >= 0x7FFFFFFF | (value <= 0) : stt = 0 : return
	i = value + 1 / 2
	repeat
		i.1 = i.0
		i.0 = (value / i.0 + i.0) / 2
		if i >= i.1 : break
	loop
	return i - (i > i.1)
#global

	randomize
	repeat 2
		pos cnt * 350 +  10, 10 : mes "ルート"
		pos cnt * 350 + 100, 10 : mes "モジュール"
		pos cnt * 350 + 200, 10 : mes "sqrt関数"
	loop
	repeat 40
		x = rnd(1000) + rnd(1000) * rnd(1000) * rnd(5) + 1
		pos cnt / 20 * 350 +  10, cnt \ 20 * 20 + 40 : mes x
		pos cnt / 20 * 350 + 100, cnt \ 20 * 20 + 40 : mes sqrt2(x)
		pos cnt / 20 * 350 + 200, cnt \ 20 * 20 + 40 : mes sqrt(x)
	loop