12_floatとfloatintの違い.hsp

sample\hspint64.dll\12_floatとfloatintの違い.hsp » Plain Format

// hsp3_64.as → hspint64.as の順にインクルードしてください。
// また、varptr や callfunc をマクロで置き換えている都合上、
// hspint64.as のインクルードは なるべく上に書いておくことをお勧めします。
// なお、varptr や callfunc をマクロの置換をしない場合は、以下のコメントを解除してください。
// #define CANCEL_UNDEF_HSPINT64 

#include "hsp3_64.as"
#include "hspint64.as"

;
; float for HSP モジュール
; http://spn.php.xdomain.jp/hsp_koneta3.htm#tofloat
;

#module
#defcfunc todouble int p1
	temp = 0.0
	lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000)
	lpoke temp, 0, p1 << 29
	return temp

#defcfunc tofloat double p1
	temp = p1
	return lpeek(temp)>>29&7|(p1<0)<<31|lpeek(temp,4)-(p1!0)*0x38000000<<3

#define global ctype	fadd(%1, %2)	tofloat(todouble(%1) + todouble(%2))
#define global ctype	fsub(%1, %2)	tofloat(todouble(%1) - todouble(%2))
#define global ctype	fmul(%1, %2)	tofloat(todouble(%1) * todouble(%2))
#define global ctype	fdiv(%1, %2)	tofloat(todouble(%1) / todouble(%2))
#define global ctype	fneg(%1)	((%1) ^ 0x80000000)
#global

// floatとfloatintの違いについて

// float型はプラグインによって拡張された変数の型です。
// float値のまま、四則演算を行ったり、mes で表示することができます。

f = float(1.0)
mes "float の値 = " + f

f1 = float(10.0)
f2 = float(20.0)
mes "f1 = " + f1
mes "f2 = " + f2
mes "f1 + f2 = " + (f1 + f2)
mes ""

// 一方、floatint型はint型変数にfloat値を強制格納する方式であり、
// プラグインなしで利用することができます。(floatintという型はなく、int型です)
// しかし、利用場面によっては煩雑だったり、意図した値が取れない場合があります。
// 例えば mes で表示する場合などです。

// float -> str 変換
// mes 命令では、int型 だと思っているので、意図した値にならない。
fi = tofloat(1.00)
mes "floatint の値(おかしい例) = " + fi

// float -> double -> str 変換
// todouble() を挟めば意図した値になりますが、double 型への変換が入ります。
// また、四則演算もできますが、直感的ではありません。
mes "floatint の値 = " + todouble(fi)

fi1 = tofloat(10.0)
fi2 = tofloat(20.0)
mes "fi1 = " + todouble(fi1)
mes "fi2 = " + todouble(fi2)
mes "fi1 + fi2 = " + todouble( fadd( fi1, fi2))