計算関数の拡張

投稿者:Material 305033 1 mini cfm_ 投稿日:2016/09/05 19:48

基本的な計算の関数です。2.3乗のような計算もできるようになりました。

参考になったサイト:d.hatena.ne.jp/arakik10/20141202/p1, d.hatena.ne.jp/kazu-yamamoto/20090223/1235372875



 関数一覧
#xのn乗 (xは全ての実数, nは0以上の整数)
#  なお、nが小数のときは、nを分数(a/b)にしてroot(pow(x,a),b)
#        nがマイナスのときは、1/pow(x,-n) で求められます
  pow(x,n)

# xのn乗根を求める (xは全ての実数,nは0以上の整数)
  root(x,n)

#四捨五入
  round(n)

#切り上げ
  ceil(n)

#四捨五入 桁数指定 (f=0で小数第1位を切り捨て, f=1で小数第2位を切り捨て, ...)
  round2(n,f)

#切り上げ 桁数指定
  ceil2(n,f)

#切り捨て 桁数指定
  floor2(n,f)

#絶対値
  abs(n)

# nの自然対数 (nは全ての実数)
  ln(n)

#最大値
  max(n,m)

#最小値
  min(n,m)

#数値をmin~maxに収める
  clamp(n,min,max)

#ラジアンを度に変換
  radToDeg(n)

#度をラジアンに変換
  degToRad(n)

#min~maxの整数の乱数を生成
  randInt(min,max)

#min~maxの乱数を生成
  randFloat(min,max)

#数値numを文字chでn文字に埋める (例 (135,"0",5)="00135", (-135,"*",5)="-**135",(135,"0",2)="135", (135,"ab",5)="abab135"
  paddingNumber(num,ch,n)





 使用例
pow(2.5,8)           # 2.5 ^ 8 = 1525.87890625
root(529,7)          # 529 ^ (1 / 7) = 2.4494303572199545
root(pow(513,2),7)   # 513 ^ (2 / 7) = 5.947291796943131
round(10.4)          # round(10.4) = 10
ceil(10.4)           # ceil(10.4) = 11
round2(10.4055,3)    # round2(10.4055, 3) = 10.406
ceil2(10.4055,3)     # ceil2(10.4055, 3) = 10.406
floor2(10.4055,3)    # floor2(10.4055, 3) = 10.405
abs(-32.1)           # |-32.1| = 32.1
ln(12.34)            # log_e ^ 12.34 = 2.5128460184767505
max(10,20)           # max(10, 20) = 20
min(-10.2,-10.1)     # min(-10.2, -10.1) = -10.2
clamp(5,12,60)       # clamp(5, 12, 60) = 12
radToDeg(0.52359877) # radToDeg(0.52359877) = 29.999999679241103
degToRad(215)        # degToRad(215) = 3.7524578917878086
randInt(2,6)         # randInt(2, 6) = 2
randFloat(2,6)       # randFloat(2, 6) = 4.912605756157733
paddingNumber(315,"0", 6)   # paddingNumber(315, "0", 6) = 000315




 関数のスクリプト(これを貼り付けてください)
#計算関数用の初期化
def initMath()
  setVariable("MATH_E",2.718281828459045)
  setVariable("MATH_PI",3.141592653589793)
  setVariable("MATH_POW10",createArray())
  a=getVariable("MATH_POW10")
  y=1
  n=0
  while n<309
    a[n]=y
    y=y*10
    n=n+1
  end
end
initMath()


#xのn乗を計算(xは全ての実数, nは0以上の整数)
#  なお、nが小数のときは、nを分数(a/b)にしてroot(pow(x,a),b)
#        nがマイナスのときは、1/pow(x,-n) で求められます
def pow(x,n)
  if n<1
    return 1
  end
  y=1
  while n>1
    if (n%2)==1
      y=y*x
      x=x*x
      n=(n-1)/2
    else
      x=x*x
      n=n/2
    end
  end
  return y*x
end

# xのn乗根を求める(xは全ての実数,nは0以上の整数)  例)root(3,70)=1.01581826615963
def root(x,n)
  q=0.0000000001
  r=x
  while true
    p=r
    r=((n-1)*r)/n+x/(n*pow(r,n-1))
    if (p-r)/r<=q
      return r
    end
  end
end

#四捨五入
def round(n)
  return floor(n+0.5)
end

#切り上げ
def ceil(n)
  return -floor(-n)
end

#四捨五入 桁数指定
def round2(n,f)
  b=getVariable("MATH_POW10")[f]
  return floor(n*b+0.5)/b
end

#切り上げ 桁数指定
def ceil2(n,f)
  b=getVariable("MATH_POW10")[f]
  return -floor(-n*b)/b
end

#切り捨て 桁数指定
def floor2(n,f)
  b=getVariable("MATH_POW10")[f]
  return floor(n*b)/b
end

#絶対値
def abs(n)
  if n<0
    return -n
  else
    return n
  end
end

#E^num (numは整数)
def exp(num)
  return pow(2.718281828459045,num)
end

# 1近傍でlnの精度の良い級数展開の結果を返す
def lnNearOne(x)
  X=(x-1)/(x+1)
  sum=0
  i=0
  while i<=10
    sum=sum+2*(1/(2*i+1))*pow(X,2*i+1)
    i=i+1
  end
  return sum
end

# nの自然対数 (nは全ての実数) (例 ln(3.5)=1.2527629684951374, ln(10)=2.3025850929939726
# Ref: oshiete1.goo.ne.jp/qa1880549.html
def ln(n)
  i=0
  while abs(n-1)>=1
    n=sqrt(n)
    i=i+1
  end
  return pow(2,i)*lnNearOne(n)
end

#最大値
def max(n,m)
  if n>m
    return n
  else
    return m
  end
end

#最小値
def min(n,m)
  if n>m
    return m
  else
    return n
  end
end

#数値をmin~maxに収める
def clamp(n,min,max)
  if n<min
    return min
  elsif max<n
    return max
  else
    return n
  end
end

#ラジアンを度に変換
def radToDeg(n)
  return n*57.29577951308232
end

#度をラジアンに変換
def degToRad(n)
  return n*0.017453292519943296
end

#min~maxの整数の乱数を生成
def randInt(min,max)
  return floor(rand()*(max-min+1))+min
end

#min~maxの乱数を生成
def randFloat(min,max)
  return rand()*(max-min)+min
end

#数値の文字埋め (例 (135,"0",5)="00135", (-135,"*",5)="-**135",(135,"0",2)="135", (135,"ab",5)="abab135"
def paddingNumber(num,ch,n)
  if num<0
    s=toString(-num)
    n=n-getArrayLength(splitString(s,""))
    while n>0
      s=ch+s
      n=n-1
    end
    return "-"+s
  else
    s=toString(num)
    n=n-getArrayLength(splitString(s,""))
    while n>0
      s=ch+s
      n=n-1
    end
    return s
  end
end




コメントする

コメントするには、ログインする必要があります。

コメント一覧

            mini mosmoss(投稿日:2016/09/09 20:40, 履歴)
ラジアン変換とか未だにいその都度調べたり
3とかで代用したりしてしまうのでこのまとめは有り難くブクマはべり候です

2.3乗とかどう使うか想像できません!