bc günlük ve faktöriyel hesaplamayı desteklemiyor mu?


17

Başka bir komut satırı hesap makinesi olduğunu destekler var mıdır log, n!hesaplamalar? En azından bcbunu yapamam, bana ayrıştırma hatası söyledi

Senaryo kullanabilsem en iyisi, örn. echo '5!' | program

Yanıtlar:


20

bc-lbayrakla çağrıldığında doğal logaritmayı destekler . Base-10 veya base-2 günlüğünü onunla hesaplayabilirsiniz:

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

l(256)/l(2)
8.00000000000000000007

Yerleşik bir faktöriyel olduğunu düşünmüyorum, ancak bu kendinizi yazmak için yeterince kolay:

$ 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

Veya:

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 uyumlu olmak için şunu yazmanız gerekir:

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

Yani: tek karakter işlev adı, hayır print, hayır halt, parantez içinde gereklidir return(x). Giriş doğrulamasına ihtiyacınız yoksa (burada pozitif tamsayı numaraları için), sadece:

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

1
Negatif bir sayı veya sıfır verirseniz, n == 1 kontrolü sonsuz döngü ile sonuçlanır. bc man sayfasında olduğu gibi n <= 1 kullanın. Gerçekten de, negatif sayılarla ilgili bir hata döndürmelidir - en.wikipedia.org/wiki/… 'a göre, bu faktöriyelleri hesaplamak için özyineleme için kullanılan bilinen bir sorundur.
cas

bu, faktöriyörün mükemmel uygulamasında bir çalışma anlamına gelmez, sadece bc'nin özyinelemeli fonksiyonlar da dahil olmak üzere fonksiyonlara sahip olduğunu gösteren basit bir demo.
Mat

doğru, ama birisi bir gün bu örnek işlevi okuyacak ve "harika, bunu nasıl yapacağımı merak ediyordum" diyip kullanacak. BTW, olabildiğince bir matematik meraklısı olmaktan çok uzaktayım ve hala bir bilgisayar meraklısıyım ... ama bir hatayı düzelttiğim için önce küçük bir araştırma
yapmamın

Tamam, işte böyle. Özyinelemeli ve yinelemeli sürümleri düzeltin ...
Mat

tam olarak doğru değil:, 0!=1tıpkı 1!=1. En azından wikipedia böyle söylüyor.
cas

4

Orpie olduğu hesap makinesi ve komut satırı inekler için hesap makinesi. Elbette hesaplamanın tek gerçek yolu olan modern bir HP RPN hesap makinesini öykünür.

TIs, Casios ve benzerleri üzerinde yükselen bir hesap makinesi iseniz, yeniden eğitiminize başlayabileceğiniz birçok çevrimiçi RPN öğreticisi vardır . RPN Düşünme Biçimi'ni öğrendikten sonra Orpie el kitabı sizin için biraz yararlı olacaktır.

5 hesaplamak için! Eğer yazacağınız olarak Orpie içinde, sadece yazın: 5 !. Önce yığının üzerine Enteritmek 5için aralarına basabilirsiniz , ancak gerekli değildir.

İşlem kaydı 10'u (5) hesaplamak için yazın 5 Enter ' l o Enter. 5Bu durumda ilk önce yığının üstüne itmeniz gerekir , çünkü bir sonraki tuş vuruşu bir operatör değildir. Bu tek tırnak karakteri log10, sadece ilk iki karakterle benzersiz bir şekilde tanımlayabileceğiniz yazmaya başlamanıza izin veren komut kısaltma moduna girer . ( bunun yerine ltek başına doğal günlük işlevini alır ln.)

Herhangi bir RPN hesap makinesinde olduğu gibi, biraz pratik yaparak Orpie ile gerçekten hızlı bir şekilde alabilirsiniz .

Orpie stokta Ubuntu depolarında. FreeBSD bunu Ports, as gibi içerir math/orpie. OS X'te, Homebrew üzerinden kurabilirsiniz . Diğer işletim sistemleri için üçüncü taraf paketleri bulunabilir. OCaml ile yazılmış olduğundan ve muhtemelen bir OCaml geliştirme ortamına sahip olmadığınızdan , kaynaktan inşa etmek biraz angarya olabilir . Bununla birlikte, bir kurulum yapmak özellikle zor değildir.


2

Her zaman GNU Octave , komut satırı hesap makinelerinin emac'ları vardır (hesap makinenize yerleşik tam bir geliştirme ortamı ve programlama dili ve binlerce isteğe bağlı eklenti istediğinizde)

veya R istatistiği sizin için daha uygunsa.

Çoğunlukla bc -lstandart matematik kütüphanesini yüklemek için kullanıyorum ... Hatta bctakma ad verdim bc -l. Faktöriyel bir işlevi tanımlama hakkında bilgi için Mat'ın cevabına bakın .... bcman sayfası bunu şu şekilde tanımlasa da:

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

== 1 yerine <= 1 olup olmadığını denetlemek, negatif bir sayı (hata olması gerekir) veya sıfır (geçerli) beslemek için sonsuz bir döngüyü önler.


1

En sevdiğim hafif, basit W-Calc. http://w-calc.sourceforge.net

El kitabına bakmanız veya ortak fonksiyonları manuel olarak yeniden oluşturmanız gerekmiyor, tıpkı sizin yaptığınız gibi bc- komutlar çoğunlukla tam olarak beklediğiniz şeydir, bu yüzden sadece istediğinizi yazın ve sadece çalışır. Sorunuza göre test - gerçekten log()& n!beklendiği gibi çalışın.

(Kuşkusuz Orpie'yi duymadım - çok daha iyi bir seçenek olabilir.)


0

Tamamen overkill, ancak programlama dili tercümanları sonuçta komut satırı hesaplayıcılarıdır:

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

-1

Mac Bağlantı Noktalarınız varsa:

$ sudo /opt/local/bin/port install orpie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.