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, как на странице руководства bc. Однако в действительности он должен возвращать ошибку отрицательных чисел - согласно en.wikipedia.org/wiki/… Это известная проблема с использованием рекурсии для вычисления факториалов.
Cas
это не исследование идеальной реализации факториала, это просто демонстрация, демонстрирующая, что bc имеет функции, включая рекурсивные функции.
Мат
правда, но кто-то когда-нибудь прочитает эту примерную функцию и скажет: «Отлично, мне было интересно, как это сделать» и использовал ее. Кстати, я не настолько увлечен математикой, как вы, и все еще остаюсь компьютерным фанатом ... но так как я исправлял ошибку, я подумал, что лучше сначала провести небольшое исследование :)
cas
Хорошо, вот и все. Правильные рекурсивные и итерационные версии ...
Мат
не совсем правильно 0!=1, просто так 1!=1. По крайней мере, так говорит Википедия.
Cas
4

Orpie - это калькулятор для фанатов калькулятора и командной строки. Он эмулирует современный калькулятор HP RPN, который, конечно, является единственным верным способом расчета.

Если вы еретик-калькулятор, выросший на TI, Casios и т. Д., Есть много онлайн- учебников по RPN, с которых вы можете начать свое перевоспитание. Руководство Orpie в конечном итоге пригодится вам, как только вы научитесь думать RPN.

Чтобы вычислить 5! в Orpie, просто введите его , как вы бы писать: 5 !. Вы можете нажать Enterмежду ними, чтобы 5сначала поместить их в стек, но это не обязательно.

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

Как и в любом другом калькуляторе RPN, с Orpie вы можете по- настоящему быстро справиться с практикой.

Orpie есть в репозитории Ubuntu. FreeBSD включает его в Ports, as math/orpie. На OS X вы можете установить его через Homebrew . Сторонние пакеты могут быть доступны для других ОС. Сборка из исходного кода может быть немного трудной, поскольку она написана на OCaml , и у вас, вероятно, не установлена ​​среда разработки OCaml. Однако настроить его не особенно сложно.

Уоррен Янг
источник
2

Всегда есть GNU Octave , emacs калькуляторов командной строки (для тех случаев, когда вам нужна полная среда разработки и язык программирования, встроенный в калькулятор, и тысячи дополнительных дополнений)

или 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!работает, как ожидалось.

(По общему признанию я не слышал об Орпи - очень хорошо может быть лучшим вариантом.)

Demis
источник
0

Совершенно излишне, но интерпретаторы языка программирования в конце концов являются калькуляторами командной строки:

$ echo 5 | python -c 'import sys; import math; print math.factorial(int(sys.stdin.readline()));'
120
golimar
источник
-1

Если у вас есть порты Mac:

$ sudo /opt/local/bin/port install orpie
Джошуа Пол
источник