llPowっていうのもあるんっすけどね。
floatオンリーなので、integerバージョンを作る必要があったわけっす。
どうもぺんぎんっす( ◎v◎ )
でも、llPowと明らかに違う点もあるっす。
1.結果が巨大な数になった場合(あふれた場合)
llPow Infinityを返す
pmIntPow 掛け算しまくった値を返す。
(オーバーフローもお構いなしに掛けまくりっす)
2.exponentが負の場合
llPow 0.0を返す
pmIntPow 1を返す
上記のような違いもあるっすから、きっちりintegerに収まるときだけ
使用するのが吉かもっすね。
試してもらえば分かるっすけど、今回はllPowの方が早いっす。
でも、10,000回の試行であんなもんっすから、
実用には耐えるんじゃないかと思うっす。
integer pmIntPow(integer base, integer exponent) // baseのexponent乗を返す
{
// integer base 底
// integer exponent 指数部
integer ans = 1;
for( ; exponent > 0; exponent = exponent >> 1)
{
if(exponent & 0x1) // if((exponent & 0x1) == 1)
{
ans *= base;
}
base *= base;
}
return ans;
}
default
{
// 以下テスト
touch_start(integer num_detected)
{
integer i_test_base = 4079;
integer i_test_exponent = 4096;
float f_test_base = 4079.0;
float f_test_exponent = 4096;
integer i;
llResetTime();
for(i = 0; i < 10000; i++)
{
llPow(f_test_base, f_test_exponent);
}
llOwnerSay("llPow time:" + (string)llGetTime());
llOwnerSay((string)llPow(f_test_base, f_test_exponent));
llResetTime();
for(i = 0; i < 10000; i++)
{
pmIntPow(i_test_base, i_test_exponent);
}
llOwnerSay("pmIntPow time:" + (string)llGetTime());
llOwnerSay((string)pmIntPow(i_test_base, i_test_exponent));
}
}
0 件のコメント:
コメントを投稿