bc unterstützt keine logarithmischen und faktoriellen Berechnungen?


17

Gibt es einen anderen Kommandozeilen - Rechner an, dass Träger log, n!Berechnungen? Zumindest bckann ich das nicht, sagte es mir, Fehler zu analysieren

Es ist am besten, wenn ich Skript verwenden könnte, z echo '5!' | program

Antworten:


20

bcunterstützt den natürlichen Logarithmus, wenn er mit dem -lFlag aufgerufen wird . Sie können das Base-10- oder Base-2-Protokoll damit berechnen:

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

l(256)/l(2)
8.00000000000000000007

Ich glaube nicht, dass es eine eingebaute Fakultät gibt, aber das ist einfach genug, um sich selbst zu schreiben:

$ 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

Oder:

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

Um POSIX-kompatibel zu sein, müssen Sie Folgendes schreiben:

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))
}

Das heißt: Name der Einzelzeichenfunktion, nein print, nein halt, Klammer erforderlich in return(x). Wenn Sie keine Eingabevalidierung benötigen (hier für positive Ganzzahlen), ist es nur:

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

1
Wenn Sie nach n == 1 suchen, erhalten Sie eine Endlosschleife, wenn Sie eine negative Zahl oder Null eingeben. Verwenden Sie stattdessen n <= 1 wie in der Manpage bc. In Wirklichkeit sollte es jedoch einen Fehler mit negativen Zahlen geben - laut en.wikipedia.org/wiki/… ist dies ein bekanntes Problem bei der Verwendung der Rekursion zur Berechnung von Fakultäten.
cas

Dies ist nicht als Studie zur perfekten Implementierung von Fakultät gedacht, sondern nur als einfache Demo, um zu zeigen, dass bc Funktionen hat, einschließlich rekursiver Funktionen.
Mat

stimmt, aber irgendwann wird jemand diese Beispielfunktion lesen und sagen: "Großartig, ich habe mich gefragt, wie das geht" und sie verwenden. Übrigens, ich bin weit davon entfernt, ein Mathematikfreak zu sein, wie Sie sein können, und immer noch ein Computerfreak ... aber da ich einen Fehler korrigiert habe, dachte ich, ich sollte zuerst ein wenig recherchieren :)
cas

Ok, los geht's. Korrigieren Sie rekursive und iterative Versionen ...
Mat

nicht ganz richtig: 0!=1genauso 1!=1. Zumindest sagt das Wikipedia.
cas

4

Orpie ist der Taschenrechner für Rechner- und Kommandozeilenfreaks. Es emuliert einen modernen HP RPN-Rechner, der natürlich die einzig wahre Berechnungsmethode ist.

Wenn Sie ein Taschenrechner-Häretiker sind, der auf TIs, Casios und dergleichen aufbaut, gibt es viele RPN- Tutorials online, mit denen Sie Ihre Umerziehung beginnen können. Das Orpie-Handbuch wird Ihnen irgendwann von Nutzen sein, sobald Sie die RPN-Denkweise verstanden haben.

5 berechnen! in orpie, geben Sie es, wie Sie es schreiben würde: 5 !. Sie können Enterzwischen ihnen drücken, um sie zuerst 5auf den Stapel zu schieben , dies ist jedoch nicht erforderlich.

Geben Sie zum Berechnen von Protokoll 10 (5) Folgendes ein 5 Enter ' l o Enter. 5In diesem Fall müssen Sie das Symbol zuerst auf den Stapel schieben , da der nächste Tastendruck kein Operator ist. Dieses einfache Anführungszeichen wechselt in den Befehlsabkürzungsmodus, in dem Sie mit der Eingabe beginnen können log10, die Sie nur anhand der ersten beiden Zeichen eindeutig identifizieren können. ( lAlleine erhalten Sie lnstattdessen die natürliche Protokollfunktion .)

Wie bei jedem RPN-Rechner können Sie mit Orpie sehr schnell und mit ein wenig Übung arbeiten.

Orpie ist auf Lager Ubuntu Repos. FreeBSD enthält es in Ports, as math/orpie. Unter OS X können Sie es über Homebrew installieren . Pakete von Drittanbietern sind möglicherweise für andere Betriebssysteme verfügbar. Das Erstellen aus dem Quellcode ist möglicherweise etwas mühsam, da es in OCaml geschrieben ist und wahrscheinlich keine OCaml-Entwicklungsumgebung installiert ist. Es ist jedoch nicht besonders schwierig, eine Einrichtung zu finden.


2

Es gibt immer GNU Octave , die Emacs von Befehlszeilenrechnern (wenn Sie eine vollständige Entwicklungsumgebung und Programmiersprache in Ihren Rechner integriert haben möchten, und Tausende von optionalen Add-Ons)

oder R, wenn Statistiken eher dein Ding sind.

Ich verwende meistens nur bc -l, um die Standard-Mathematikbibliothek zu laden ... ich habe sogar bcAlias ​​zu bc -l. Siehe Mat Antwort für Informationen über eine Fakultätsfunktion definieren .... obwohl der bcMann Seite definiert sie als:

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

Das Prüfen auf <= 1 anstelle von == 1 verhindert eine Endlosschleife, wenn Sie eine negative Zahl (sollte ein Fehler sein) oder Null (gültig) eingeben.


1

Mein Favorit ist das leichte, einfache W-Calc. http://w-calc.sourceforge.net

Sie müssen nicht im Handbuch nachschauen oder allgemeine Funktionen manuell neu erstellen, wie Sie es mit tun bc- die Befehle sind größtenteils genau das, was Sie erwarten. Geben Sie einfach das ein, was Sie möchten, und es funktioniert. Testen gemäß Ihrer Frage - in der Tat log()und n!arbeiten wie erwartet.

(Zugegeben, ich habe noch nie von Orpie gehört - sehr wohl eine bessere Option.)


0

Total übertrieben, aber Programmiersprachen-Interpreter sind doch Kommandozeilenrechner:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.