やってみると、Perlの数学関係はまったく充実していないことが判明 😳 。やっぱり PARI/GP のように数学に特化したものにする方が良いかも。そうは言っても、所詮は四則演算だけで済むので、必要な関数を自前で作ることにした。

まず整除ができない。13を5で割ると商が2で余りが3という計算。余りならば % という剰余演算子があり、13%5=3 となるらしいが、負の数に対しては Perl の実装によって結果が変わる可能性があると書いてあった。何と言語仕様で決めてないのかあ。まあ、文字列がメインターゲットってことですよね、やっぱり。

整数部分を与える関数 int(x) というのはあるが、xがマイナスのときはガウス記号とは違って int(-3.2)=-3 のようになるらしい。ああ、これも使い物にならない。

そこで、整数部分(ガウス記号)を与える関数を準備。ついでなので、切り捨て(ガウス記号)と切り上げの両方を作ってみよう。日本ではあまり普及してない呼び名だが、floor (フロアー、床)、ceiling (シーリング、天井)と言われるもの。動作は次のようになる。

 floor(3.14)=3、floor(3)=3、floor(-3.14)=-4

 ceiling(3.14)=4、ceiling(3)=3、ceiling(-3.14)=-3

効率は考えずに、とりあえず動くことだけを考えて作成。

# floor function
# &floor(3.14)=3, &floor(3)=3, &floor(-3.14)=-4
sub floor {
  my $x=$_[0];
  my $n=int($x);
  if ( $x==$n ) {
     $n;
  } elsif ( $x>0 ) {
     $n;
  } else {
     $x= -$x;
     $n=int($x);
     $n+=1;
     -$n;
  }
}

# ceiling function
# &ceiling(3.14)=4, &ceiling(3)=3, &ceiling(-3.14)=-3
sub ceiling {
  my $x=$_[0];
  my $n=int($x);
  if ( $x==$n ) {
    $n;
  } elsif ( $x > 0 ) {
    $n+=1;
    $n;
  } else {
    $x = -$x;
    $n = int($x);
    -$n;
  }
}

投稿者 sukarabe

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です