2009年08月09日
PIの比較で90度と270度を切り分けるには・・
ループ処理で角度を加算している部分で、
単純に
if(Theta==PI*0.5) {} else if (Theta==PI*1.5) { }
では浮動小数点の比較でうまくいかない状態でした。
そこで、
if ((float)((string)(Theta*RAD_TO_DEG))==90.0) { }
の様に、いったん文字列にした後にfloatに戻して比較すると期待通りに動作しました。
また、PHPのround()関数の様な物を用意しておいて、任意ケタでいったん丸めてから比較してやると動きました。
型変換とどちらが良いのでしょうか。。。ちょっと不明。
もっとも、90度と270度を切り分けるなんて、めったに出てきませんが・・^^;
単純に
if(Theta==PI*0.5) {} else if (Theta==PI*1.5) { }
では浮動小数点の比較でうまくいかない状態でした。
そこで、
if ((float)((string)(Theta*RAD_TO_DEG))==90.0) { }
の様に、いったん文字列にした後にfloatに戻して比較すると期待通りに動作しました。
また、PHPのround()関数の様な物を用意しておいて、任意ケタでいったん丸めてから比較してやると動きました。
型変換とどちらが良いのでしょうか。。。ちょっと不明。
もっとも、90度と270度を切り分けるなんて、めったに出てきませんが・・^^;
// www.lsleditor.org by Alphons van der Heijden (SL: Alphons Jano)
float round(float a,integer p)
{
float t=llPow(10.0,p);
return llRound(a*t)/t;
}
test(float theta)
{
if (ceil(theta,6)==ceil(0.5*PI,6)) {
llSay(0, "0.5");
}else if (ceil(theta,6)==ceil(1.5*PI,6))
{
llSay(0, "1.5");
}
}
default
{
state_entry()
{
integer i=64;
float dtheta=2.0*PI/i;
float theta=0;
while(i--)
{
theta=dtheta*i;
test(theta);
}
}
}