bc non supporta il log e il calcolo fattoriale?


17

C'è qualche altra riga di comando calcolatrice che supporta log, n!i calcoli? Almeno bcnon posso farlo, mi ha detto di analizzare l'errore

È meglio se potessi usare lo script, ad es echo '5!' | program

Risposte:


20

bcsupporta il logaritmo naturale se invocato con la -lbandiera. È possibile calcolare il registro base-10 o base-2 con esso:

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

l(256)/l(2)
8.00000000000000000007

Non penso che ci sia un fattoriale incorporato, ma è abbastanza facile da scrivere:

$ 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

O:

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

Per essere conforme a POSIX, dovresti scriverlo:

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

Cioè: nome della funzione a carattere singolo, no print, no halt, parentesi richiesta in return(x). Se non hai bisogno della convalida dell'input (qui per numeri interi positivi), è solo:

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

1
il controllo di n == 1 comporta un ciclo infinito se si assegna un numero negativo o zero. usa n <= 1 invece come nella pagina man di bc. In realtà, però, dovrebbe restituire un errore di numeri negativi - secondo en.wikipedia.org/wiki/… questo è un problema noto con l'utilizzo della ricorsione per calcolare fattoriali.
Caso

questo non è inteso come uno studio sull'implementazione perfetta del fattoriale, ma solo una semplice dimostrazione per dimostrare che bc ha delle funzioni, comprese le funzioni ricorsive.
Mat,

vero, ma un giorno qualcuno leggerà quella funzione di esempio e dirà "fantastico, mi stavo chiedendo come farlo" e usarlo. A proposito, sono tutt'altro che un fanatico della matematica come puoi essere e ancora un fanatico del computer ... ma dato che stavo correggendo un errore ho pensato che sarebbe meglio fare prima una piccola ricerca :)
Cas

Ok, eccoti. Corrette versioni ricorsive e iterative ...
Mat,

non del tutto corretto:, 0!=1proprio come 1!=1. Almeno, questo è quello che dice Wikipedia.
Caso

4

Orpie è la calcolatrice per i geek calcolatrice e riga di comando. Emula un moderno calcolatore HP RPN, che è ovviamente l'unico vero modo per calcolare.

Se sei un calcolatore eretico, cresciuto su TI, Casios e simili, ci sono molti tutorial RPN online con cui puoi iniziare la tua rieducazione. Il manuale di Orpie alla fine ti sarà utile, una volta capito il modo di pensare di RPN.

Per calcolare 5! in Orpie, basta digitare è come ci si scrive: 5 !. Puoi premere Entertra di loro per spingere 5prima nello stack, ma non è necessario.

Per calcolare il registro 10 (5), digitare 5 Enter ' l o Enter. In 5questo caso, devi prima inserire lo stack nello stack, poiché la successiva sequenza di tasti non è un operatore. Quel singolo carattere tra virgolette entra nella modalità abbreviazione del comando, che ti consente di iniziare a digitare log10, che puoi identificare in modo univoco solo con i primi due caratteri. (da lsolo ti offre invece la funzione log naturale ln).

Come con qualsiasi calcolatrice RPN, puoi diventare davvero veloce con Orpie, con un po 'di pratica.

Orpie è nei repository Ubuntu di serie. FreeBSD lo include in Porte, come math/orpie. Su OS X, puoi installarlo tramite Homebrew . Pacchetti di terze parti potrebbero essere disponibili per altri sistemi operativi. Costruire dalla fonte può essere un po 'noioso, poiché è scritto in OCaml e probabilmente non hai installato un ambiente di sviluppo OCaml. Tuttavia, ottenere una configurazione non è particolarmente difficile.


2

C'è sempre GNU Octave , gli emacs dei calcolatori da riga di comando (per quando vuoi un ambiente di sviluppo completo e un linguaggio di programmazione integrato nella tua calcolatrice e migliaia di componenti aggiuntivi opzionali)

o R se le statistiche sono più le tue cose.

Per lo più uso solo bc -lper caricare la libreria matematica standard ... Ho persino un bcaliasing bc -l. Vedi la risposta di Mat per informazioni sulla definizione di una funzione fattoriale .... sebbene la bcpagina man la definisca come:

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

Il controllo per <= 1 anziché == 1 impedisce un ciclo infinito se ti capita di dargli un numero negativo (dovrebbe essere un errore) o zero (valido).


1

Il mio preferito è il leggero, semplice W-Calc. http://w-calc.sourceforge.net

Non devi guardare nel manuale o ricreare manualmente le funzioni comuni, come fai con te bc: i comandi sono per lo più esattamente quello che ti aspetteresti, quindi digita semplicemente quello che vuoi e funziona. Test secondo la tua domanda - anzi log()e n!funziona come previsto.

(Devo ammettere che non ho sentito parlare di Orpie - molto bene potrebbe essere un'opzione migliore.)


0

Totalmente esagerato, ma dopo tutto gli interpreti del linguaggio di programmazione sono calcolatori da riga di comando:

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

-1

Se disponi di porte Mac:

$ sudo /opt/local/bin/port install orpie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.