bcは対数計算と階乗計算をサポートしていませんか?


17

計算をサポートする他のコマンドライン計算機はlogありn!ますか?少なくともそれbcはできません、それは私に解析エラーを伝えました

スクリプトを使用できれば最高です。例えば echo '5!' | program

回答:


20

bc-lフラグで呼び出された場合、自然対数をサポートします。base-10またはbase-2のログを計算できます:

$ bc -l
...
l(100)/l(10)
2.00000000000000000000

l(256)/l(2)
8.00000000000000000007

組み込みの階乗があるとは思いませんが、それはあなた自身を書くのに十分簡単です:

$ bc
...
define fact_rec (n) { 
  if (n < 0) {
    print "oops";
    halt;
  }
  if (n < 2) return 1;
  return n*fact_rec(n-1);
}
fact_rec(5)
120

または:

define fact_it (n) {
  if (n < 0) {
    print "oops";
    halt;
  }
  res = 1;
  for (; n > 1; n--) {
    res *= n;
  }
  return res;
}
fact_it(100)
93326215443944152681699238856266700490715968264381621468592963895217\
59999322991560894146397615651828625369792082722375825118521091686400\
0000000000000000000000

POSIXに準拠するには、次のように記述する必要があります。

define f(n) {
  auto s, m
  if (n <= 0) {
    "Invalid input: "
    n
    return(-1)
  }
  s = scale
  scale = 0
  m = n / 1
  scale = s
  if (n != m) {
    "Invalid input: "
    n
    return(-1)
  }
  if (n < 2) return(1)
  return(n * f(n - 1))
}

つまり、単一文字の関数名、no print、no halt、で必要な括弧return(x)。入力の検証が必要ない場合(正の整数の場合)、それは次のとおりです。

define f(n) {
  if (n < 2) return(1)
  return(n * f(n - 1))
}

1
n == 1をチェックすると、負の数またはゼロを与えると無限ループになります。bcのマニュアルページのように、代わりにn <= 1を使用してください。しかし、実際には、en.wikipedia.org / wiki /によると、負の数のエラーを返すはずです。これは、階乗を計算するために再帰を使用する場合の既知の問題です。
cas

これは、階乗の完全な実装の研究ではなく、bcに再帰関数を含む関数があることを示すための単純なデモです。
マット

本当ですが、誰かがいつかそのサンプル関数を読んで、「すごい、どうやってそれをやろうと思っていた」と言って、それを使うでしょう。ところで、私はできる限り数学のオタクではなく、コンピューターのオタクでもありますが、エラーを修正していたので、最初に少し調査した方がいいと思いました:)
cas

わかりました。正しい再帰バージョンと反復バージョン...
マット

まったく正しくありません:0!=1と同様1!=1です。少なくとも、それはウィキペディアが言うことです。
cas

4

Orpieがあります電卓とコマンドラインオタクの​​ための電卓です。これは、最新のHP RPN計算機をエミュレートします。これはもちろん、唯一の真の計算方法です。

あなたが電卓異端者であり、TIやカシオなどで育った場合、オンラインで多くの RPN チュートリアルを使用して再教育を開始できます。OrpieマニュアルRPNの考え方を理解すれば、は最終的にはでしょう。

5を計算するには!Orpieで、記述したとおりに入力し5 !ます。あなたは押すことができEnter、プッシュにそれらの間5て最初にスタックする、それは必須ではありません。

ログ10(5)を計算するには、と入力し5 Enter ' l o Enterます。5この場合、次のキーストロークは演算子ではないため、最初にスタックにプッシュする必要があります。その一重引用符はコマンド短縮モードに入ります。これによりlog10、入力を開始できます。これは、最初の2文字だけで一意に識別できます。(l単独で、ln代わりに自然対数関数を取得します。)

他のRPN計算機と同様に、Orpieを少し練習すれば、本当に速くなります。

OrpieはUbuntuリポジトリにあります。FreeBSDは、Portsに含まれていmath/orpieます。OS Xでは、Homebrewを使用してインストールできます。サードパーティのパッケージが他のOSで利用できる場合があります。OCamlで書かれているため、ソースからのビルドは少し面倒かもしれません。OCaml開発環境がインストールされていない可能性があります。ただし、1つのセットアップを取得するのはそれほど難しくありません。


2

常にGNU Octaveがありますはコマンドライン電卓のemacsです(電卓に完全な開発環境とプログラミング言語を組み込みたい場合や、数千のオプションのアドオンが必要な場合)

または、統計がもっと重要な場合はR。

私はほとんどの場合bc -l、標準の数学ライブラリをロードするために使用しています...にbcエイリアスを作成しましたbc -l。階乗関数の定義については、Matの回答をbc参照してください。ただし、マニュアルページでは次のように定義されています。

define f (x) {
  if (x <= 1) return (1);
  return (f(x-1) * x);
}

== 1ではなく<= 1をチェックすると、たまたま負の数(エラー)またはゼロ(有効)を入力した場合に無限ループが防止されます。


1

私のお気に入りは、軽量でシンプルW-Calcです。 http://w-calc.sourceforge.net

マニュアルを調べたり、一般的な機能を手動で再作成したりする必要はありません。bcコマンドはほとんどの場合期待どおりのものなので、必要なものを入力するだけで機能します。あなたの質問に従ってテスト-実際にlog()n!期待どおりに動作します。

(確かに私はOrpieのことを聞いたことがない-非常によく、より良いオプションかもしれません。)


0

完全にやり過ぎですが、プログラミング言語インタープリターは結局のところコマンドライン計算機です:

$ echo 5 | python -c 'import sys; import math; print math.factorial(int(sys.stdin.readline()));'
120

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.