bc не підтримує журнал та факторний розрахунок?


17

Чи є інший калькулятор командного рядка, який підтримує log, n!обчислює? Принаймні, bcне можу цього зробити, він сказав мені помилку розбору

Найкраще, якщо я міг би використовувати сценарій, наприклад echo '5!' | program

Відповіді:


20

bcпідтримує природний логарифм, якщо його посилають на -lпрапор. Ви можете обчислити журнал base-10 або base-2:

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

l(256)/l(2)
8.00000000000000000007

Я не думаю, що є вбудований факторіал, але це досить просто, щоб написати самому:

$ 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

Або:

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, вам потрібно написати:

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

Тобто: ім'я функції одного символу, ні print, ні halt, потрібні дужки в return(x). Якщо вам не потрібна перевірка введення (тут для додатних цілих чисел), це просто:

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

1
перевірка на n == 1 призводить до нескінченного циклу, якщо надати йому від’ємне число або нуль. замість цього використовуйте n <= 1, як на сторінці man-man. Дійсно, однак, він повинен повернути помилку від'ємних чисел - на думку en.wikipedia.org/wiki/… це відома проблема використання рекурсії для обчислення факторіалів.
cas

це не мається на увазі як дослідження ідеальної реалізації факторіалу, а просто простий демонстраційний показ, який показує, що bc має функції, включаючи рекурсивні функції.
мат

правда, але хтось колись прочитає цю функцію прикладу і скаже «чудово, мені було цікаво, як це зробити», і використати її. До речі, я настільки далеко, як ви математик, як ви можете, і все ще залишаєтесь комп'ютерним вундеркіптом ... але, оскільки я виправляв помилку, я подумав, що краще спершу зробити невелике дослідження :)
cas

Гаразд, там ви йдете. Правильні рекурсивні та ітеративні версії ...
Мат

не зовсім коректно: 0!=1так само 1!=1. Принаймні, так говорить вікіпедія.
cas

4

Orpie - це калькулятор для виводків калькулятора та командного рядка. Він імітує сучасний калькулятор HP RPN, що, звичайно, єдиний вірний спосіб розрахунку.

Якщо ви єретик-калькулятор, піднятий на TI, Casios тощо, в Інтернеті є багато навчальних посібників RPN, за допомогою яких ви можете розпочати переосвіта. Посібник "Орпі " з часом буде корисним для вас, як тільки ви придумаєте спосіб мислення RPN.

Для обчислення 5! в Orpie, просто введіть його , як ви б писати: 5 !. Ви можете натиснути Enterміж ними, щоб спочатку натиснути 5на стек, але це не обов'язково.

Щоб обчислити журнал 10 (5), введіть 5 Enter ' l o Enter. У 5цьому випадку вам потрібно спочатку натиснути на стек, оскільки наступне натискання клавіші не є оператором. Цей символ цитати входить у режим абревіатури команд, що дозволяє почати вводити текст log10, який ви можете однозначно ідентифікувати лише за допомогою перших двох символів. ( натомість lви отримуєте природну функцію журналу ln.)

Як і в будь-якому калькуляторі RPN, з Orpie ви можете отримати дуже швидко, трохи практикуючи.

Orpie знаходиться на складі репост Ubuntu. FreeBSD включає його в порти, як math/orpie. В OS X ви можете встановити його через Homebrew . Сторонні пакети можуть бути доступні для інших ОС. Будівництво з джерела може бути нелегкою справою, оскільки це написано в OCaml , і ви, мабуть, не встановили середовище розробки OCaml. Однак налаштування однієї налаштування не особливо складна.


2

Завжди є GNU Octave , емаки калькуляторів командного рядка (бо, коли вам потрібне повне середовище розробки та мова програмування, вбудований у ваш калькулятор, і тисячі додаткових додатків)

або R, якщо статистика більше ваша річ.

Я в основному просто використовую bc -lдля завантаження стандартної математичної бібліотеки ... Мені навіть bcпришлось bc -l. Інформацію про визначення факторної функції дивіться у відповіді Мата .... хоча bcголовна сторінка визначає це як:

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

Перевірка на <= 1, а не == 1 запобігає нескінченному циклу, якщо ви випадково подаєте його негативне число (має бути помилка) або нуль (дійсне).


1

Моя улюблена легка, проста W-Calc. http://w-calc.sourceforge.net

Не потрібно шукати в посібнику чи вручну створювати загальні функції, як це робиться з вами bc- команди в основному саме те, що ви очікували, тому просто введіть те, що вам потрібно, і воно просто працює. Тестування відповідно до вашого питання - дійсно, log()і n!працюйте так, як очікувалося.

(Правда, я не чув про Орпі - дуже добре, можливо, це буде кращий варіант.)


0

Повністю перебор, але перекладачі мови програмування - це калькулятори командного рядка:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.