2010年2月25日木曜日

べき乗っす

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 件のコメント:

コメントを投稿

Free Avatar