bc não suporta log e cálculo fatorial?


17

Existe algum outro comando calculadora linha que suporta log, n!cálculos? Pelo menos bcnão pode fazer isso, ele me disse analisar erro

É melhor eu poder usar script, por exemplo echo '5!' | program

Respostas:


20

bcsuporta o logaritmo natural se chamado com o -lsinalizador. Você pode calcular o log da base 10 ou da base 2 com ele:

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

l(256)/l(2)
8.00000000000000000007

Eu não acho que exista um fatorial embutido, mas isso é fácil o suficiente para você escrever:

$ 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

Ou:

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

Para ser compatível com POSIX, você precisa escrevê-lo:

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

Ou seja: nome da função de caractere único, não print, não halt, parênteses necessários em return(x). Se você não precisa de validação de entrada (aqui para números inteiros positivos), é apenas:

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

1
verificar n == 1 resulta em loop infinito se você der um número negativo ou zero. use n <= 1 como na página de manual do bc. Realmente, no entanto, ele deve retornar um erro de números negativos - de acordo com en.wikipedia.org/wiki/…, esse é um problema conhecido com o uso da recursão para calcular fatoriais.
cas 29/07

isso não pretende ser um estudo na perfeita implementação do fatorial, apenas uma demonstração simples para mostrar que o bc possui funções, incluindo funções recursivas.
Mat

verdade, mas alguém um dia lerá a função de exemplo e dirá "ótimo, eu queria saber como fazer isso" e usá-la. BTW, eu estou tão longe de ser um nerd de matemática quanto você pode ser e ainda ser um nerd de computador ... mas desde que eu estava corrigindo um erro, achei melhor fazer uma pequena pesquisa primeiro :)
cas

Ok, lá está você. Versões recursiva e iterativos corretos ...
Mat

não é bem correto:, 0!=1exatamente como 1!=1. Pelo menos, é o que diz a wikipedia.
29412

4

Orpie é a calculadora para geeks de calculadora e de linha de comando. Emula uma moderna calculadora HP RPN, que é obviamente a única maneira verdadeira de calcular.

Se você é um herege de calculadora, criado em TIs, Casios e outros, existem muitos tutoriais de RPN on-line com os quais você pode iniciar sua reeducação. O manual da Orpie acabará sendo útil para você, depois de entender a maneira de pensar da RPN.

Para calcular 5! em Orpie, basta digitá-lo como você escrevê-lo: 5 !. Você pode pressionar Enterentre eles para empurrar 5para a pilha primeiro, mas não é necessário.

Para calcular o log 10 (5), digite 5 Enter ' l o Enter. Você precisa 5inserir a pilha primeiro neste caso, uma vez que o próximo pressionamento de tecla não é um operador. Esse caractere de aspas simples entra no modo de abreviação de comando, que permite começar a digitar log10, que você pode identificar exclusivamente com apenas os dois primeiros caracteres. ( lsozinho, você obtém a função de log natural ln).

Como em qualquer calculadora RPN, você pode ficar muito rápido com o Orpie, com um pouco de prática.

Orpie está no repositório de ações do Ubuntu. O FreeBSD o inclui no Ports, como math/orpie. No OS X, você pode instalá-lo através do Homebrew . Pacotes de terceiros podem estar disponíveis para outros sistemas operacionais. Construir a partir da fonte pode ser um pouco trabalhoso, pois está escrito em OCaml e você provavelmente não tem um ambiente de desenvolvimento OCaml instalado. Obter uma configuração não é particularmente difícil, no entanto.


2

Sempre existe o GNU Octave , o emacs das calculadoras de linha de comando (para quando você deseja um ambiente de desenvolvimento completo e uma linguagem de programação incorporada à sua calculadora, além de milhares de complementos opcionais)

ou R se as estatísticas são mais do seu interesse.

Na maioria das vezes eu apenas uso bc -lpara carregar a biblioteca matemática padrão ... Eu até tenho um bcalias para bc -l. Consulte a resposta de Mat para obter informações sobre como definir uma função fatorial .... embora a bcpágina de manual a defina como:

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

Marcar <= 1 em vez de == 1 impede um loop infinito se você fornecer um número negativo (deve ser um erro) ou zero (válido).


1

O meu favorito é o leve, simples W-Calc. http://w-calc.sourceforge.net

Você não precisa procurar no manual ou recriar manualmente funções comuns, como faz com bc- os comandos são exatamente exatamente o que você esperaria; portanto, basta digitar o que deseja e simplesmente funciona. Teste de acordo com sua pergunta - de fato log()e n!funcione conforme o esperado.

(É certo que eu não ouvi falar de Orpie - muito bem pode ser uma opção melhor.)


0

Exagero total, mas os intérpretes da linguagem de programação são calculadores de linha de comando:

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

-1

Se você possui portas Mac:

$ sudo /opt/local/bin/port install orpie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.