bc nie obsługuje obliczeń logarytmicznych i czynnikowych?


17

Czy istnieje jakakolwiek inna linia poleceń kalkulator, który obsługuje log, n!obliczenia? Przynajmniej bcnie mogę tego zrobić, powiedział mi błąd analizy

Najlepiej, gdybym mógł użyć skryptu, np echo '5!' | program

Odpowiedzi:


20

bcobsługuje logarytm naturalny, jeśli jest wywoływany z -lflagą. Za jego pomocą możesz obliczyć dziennik base-10 lub base-2:

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

l(256)/l(2)
8.00000000000000000007

Nie sądzę, aby istniała funkcja silnia, ale łatwo jest napisać:

$ 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

Lub:

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

Aby być zgodnym z POSIX, musisz go napisać:

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

To znaczy: nazwa funkcji jednoznakowej, nie print, nie halt, nawias wymagany w return(x). Jeśli nie potrzebujesz sprawdzania poprawności danych wejściowych (tutaj dla dodatnich liczb całkowitych), to po prostu:

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

1
sprawdzanie n == 1 powoduje nieskończoną pętlę, jeśli podasz jej liczbę ujemną lub zero. użyj n <= 1 zamiast jak na stronie podręcznika bc. Naprawdę jednak powinien zwrócić błąd liczb ujemnych - według en.wikipedia.org/wiki/… jest to znany problem z wykorzystaniem rekurencji do obliczania silni.
cas

nie jest to przeznaczone jako studium doskonałej implementacji silni, tylko proste demo pokazujące, że bc ma funkcje, w tym funkcje rekurencyjne.
Mat.

to prawda, ale ktoś kiedyś przeczyta tę przykładową funkcję i powie „świetnie, zastanawiałem się, jak to zrobić” i użyć jej. BTW, jestem tak daleki od bycia maniakiem matematyki, jak możesz być i nadal być maniakiem komputerowym ... ale odkąd poprawiłem błąd, pomyślałem, że powinienem najpierw zrobić trochę badań :)
cas

Okej, proszę bardzo. Prawidłowe wersje rekurencyjne i iteracyjne ...
Mat.

niezupełnie poprawne: 0!=1podobnie jak 1!=1. Przynajmniej tak mówi wikipedia.
cas

4

Orpie jest kalkulator kalkulator i wiersza poleceń maniaków. Emuluje nowoczesny kalkulator HP RPN, który jest oczywiście jedynym prawdziwym sposobem obliczania.

Jeśli jesteś heretykiem kalkulatorem, wychowanym na TI, Casios i tym podobnych, istnieje wiele samouczków RPN online, z którymi możesz rozpocząć reedukację. Podręcznik Orpie w końcu przyda ci się, gdy zdobędziesz sposób myślenia RPN.

Aby obliczyć 5! w Orpie, wystarczy wpisać go jak chcesz go napisać: 5 !. Możesz naciskać Entermiędzy nimi, aby 5najpierw pchnąć się na stos, ale nie jest to konieczne.

Aby obliczyć log 10 (5), wpisz 5 Enter ' l o Enter. W tym przypadku musisz 5najpierw przesunąć stos na stos, ponieważ następnym naciśnięciem klawisza nie jest operator. Ten pojedynczy cudzysłów przechodzi w tryb skrótów poleceń, który umożliwia rozpoczęcie pisania log10, które można jednoznacznie zidentyfikować za pomocą tylko dwóch pierwszych znaków. ( lsama daje ci naturalną funkcję dziennika ln.)

Podobnie jak w przypadku każdego kalkulatora RPN, możesz uzyskać naprawdę szybki z Orpie, z odrobiną praktyki.

Orpie jest w magazynie repozytoriów Ubuntu. FreeBSD włącza go do portów, as math/orpie. W systemie OS X można go zainstalować za pośrednictwem Homebrew . Pakiety innych firm mogą być dostępne dla innych systemów operacyjnych. Budowanie ze źródła może być trochę uciążliwe, ponieważ jest napisane w OCaml i prawdopodobnie nie masz zainstalowanego środowiska programistycznego OCaml. Przygotowanie jednego nie jest jednak szczególnie trudne.


2

Zawsze jest GNU Octave , emacs kalkulatorów wiersza poleceń (gdy chcesz mieć pełne środowisko programistyczne i język programowania wbudowany w kalkulator, a także tysiące opcjonalnych dodatków)

lub R, jeśli statystyki są bardziej twoje.

Przeważnie używam tylko bc -ldo załadowania standardowej biblioteki matematycznej ... Nawet bcdo niej pseudonimem bc -l. Zobacz odpowiedź Mat, aby uzyskać informacje na temat definiowania funkcji silni .... ale bcstrona podręcznika definiuje ją jako:

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

Sprawdzanie <= 1 zamiast == 1 zapobiega niekończącej się pętli, jeśli zdarzy ci się podać jej liczbę ujemną (powinien to być błąd) lub zero (prawidłowy).


1

Moim ulubionym jest lekki, prosty W-Calc. http://w-calc.sourceforge.net

Nie musisz zaglądać do instrukcji ani ręcznie odtwarzać typowych funkcji, tak jak robisz bc- polecenia są w większości dokładnie takie, jakich oczekujesz, więc po prostu wpisz, co chcesz, i po prostu działa. Testowanie zgodnie z twoim pytaniem - rzeczywiście log()i n!działaj zgodnie z oczekiwaniami.

(Co prawda nie słyszałem o Orpie - bardzo dobrze może być lepszą opcją.)


0

Całkowicie przesada, ale tłumacze języka programowania są przecież kalkulatorami wiersza poleceń:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.