bc tidak mendukung perhitungan log dan faktorial?

17

Apakah ada kalkulator baris perintah lain yang mendukung log, n!perhitungan? Setidaknya bctidak bisa melakukan itu, ia mengatakan kesalahan parse

Lebih baik jika saya bisa menggunakan skrip, mis echo '5!' | program

bunga aster
sumber

Jawaban:

20

bcmendukung logaritma natural jika dipanggil dengan -lbendera. Anda dapat menghitung log basis-10 atau basis-2 dengan itu:

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

l(256)/l(2)
8.00000000000000000007

Saya tidak berpikir ada faktorial bawaan, tapi itu cukup mudah untuk menulis sendiri:

$ 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

Atau:

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

Agar sesuai dengan POSIX, Anda harus menulisnya:

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

Yaitu: nama fungsi karakter tunggal, tidak print, tidak halt, tanda kurung diperlukan dalam return(x). Jika Anda tidak memerlukan validasi input (di sini untuk bilangan bulat positif), itu hanya:

define f(n) {
  if (n < 2) return(1)
  return(n * f(n - 1))
}
Tikar
sumber
1
memeriksa n == 1 menghasilkan loop tak berujung jika Anda memberinya angka negatif atau nol. gunakan n <= 1 sebagai gantinya di halaman manual bc. Sungguh, itu seharusnya mengembalikan kesalahan angka negatif - menurut en.wikipedia.org/wiki/... ini adalah masalah yang diketahui dengan menggunakan rekursi untuk menghitung faktorial.
cas
ini tidak dimaksudkan sebagai studi dalam penerapan faktorial yang sempurna, hanya demo sederhana untuk menunjukkan bahwa bc memiliki fungsi, termasuk fungsi rekursif.
Mat
benar, tetapi seseorang suatu hari nanti akan membaca contoh itu berfungsi dan berkata "hebat, saya ingin tahu bagaimana melakukan itu" dan menggunakannya. BTW, saya hampir menjadi seorang geek matematika yang Anda bisa dan masih menjadi geek komputer ... tetapi karena saya memperbaiki kesalahan saya pikir saya lebih baik melakukan sedikit riset terlebih dahulu :)
cas
Ok, ini dia. Versi rekursif dan berulang yang benar ...
Mat
tidak sepenuhnya benar:, 0!=1sama seperti 1!=1. Setidaknya, itulah yang dikatakan wikipedia.
cas
4

Orpie adalah yang kalkulator untuk kalkulator dan baris perintah Geeks. Ini mengemulasi kalkulator HP RPN modern, yang tentu saja satu-satunya cara yang benar untuk menghitung.

Jika Anda seorang bidat kalkulator, dibesarkan di TI, Casios, dan semacamnya, ada banyak tutorial RPN online yang dengannya Anda dapat memulai pendidikan ulang Anda. Manual Orpie pada akhirnya akan berguna bagi Anda, setelah Anda mendapatkan cara berpikir RPN.

Untuk menghitung 5! di Orpie, ketik saja seperti yang Anda akan menulis itu: 5 !. Anda dapat menekan di Enterantara mereka untuk mendorong 5ke tumpukan terlebih dahulu, tetapi itu tidak perlu.

Untuk menghitung log 10 (5), ketik 5 Enter ' l o Enter. Anda harus mendorongnya 5ke tumpukan terlebih dahulu dalam kasus ini, karena keystroke berikutnya bukan operator. Karakter kutipan tunggal itu memasuki mode singkatan perintah, yang memungkinkan Anda mulai mengetik log10, yang dapat Anda identifikasi secara unik hanya dengan dua karakter pertama. ( Sebagai gantinya l, Anda mendapatkan fungsi log natural ln.)

Seperti halnya kalkulator RPN, Anda bisa menjadi sangat cepat dengan Orpie, dengan sedikit latihan.

Orpie ada dalam stok repo Ubuntu. FreeBSD memasukkannya dalam Ports, as math/orpie. Pada OS X, Anda dapat menginstalnya melalui Homebrew . Paket pihak ketiga mungkin tersedia untuk OS lain. Membangun dari sumber mungkin sedikit tugas, karena ditulis dalam OCaml , dan Anda mungkin tidak menginstal lingkungan pengembangan OCaml. Mempersiapkannya tidak terlalu sulit.

Warren Young
sumber
2

Selalu ada GNU Octave , emacs dari kalkulator baris perintah (untuk saat Anda menginginkan lingkungan pengembangan yang lengkap dan bahasa pemrograman bawaan untuk kalkulator Anda, dan ribuan add-ons opsional)

atau R jika statistik lebih penting.

Saya kebanyakan hanya menggunakan bc -luntuk mendapatkan perpustakaan matematika standar dimuat ... Saya bahkan telah bcalias bc -l. Lihat jawaban Mat untuk info tentang mendefinisikan fungsi faktorial .... meskipun bchalaman manual mendefinisikannya sebagai:

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

Memeriksa <= 1 daripada == 1 mencegah perulangan tanpa akhir jika Anda memberinya angka negatif (harus berupa kesalahan) atau nol (valid).

cas
sumber
1

Favorit saya adalah yang ringan, sederhana W-Calc. http://w-calc.sourceforge.net

Anda tidak harus melihat di manual atau secara manual membuat ulang fungsi-fungsi umum, seperti yang Anda lakukan bc- perintah-perintahnya sebagian besar persis apa yang Anda harapkan, jadi ketikkan saja apa yang Anda inginkan dan itu hanya berfungsi. Menguji sesuai pertanyaan Anda - memang log()& n!berfungsi seperti yang diharapkan.

(Memang saya belum pernah mendengar tentang Orpie - mungkin pilihan yang lebih baik.)

Demis
sumber
0

Benar-benar berlebihan, tetapi juru bahasa pemrograman adalah kalkulator baris perintah setelah semua:

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

Jika Anda memiliki Port Mac:

$ sudo /opt/local/bin/port install orpie
joshua paul
sumber