Solver expressão de linha de comando?

8

Estou procurando uma calculadora baseada em TTY compatível com Linux. Por exemplo:

user@host:~$ calculate
> 2
2
user@host:~$ calculate
> 8*6-4
44
user@host:~$ calculate
> 8*(6-4)
16

Existe algo assim que suporta operações básicas, algumas funções internas como atan()e, possivelmente, funções personalizadas via script?

Lucas Phillips
fonte

Respostas:

7

bc & dc

bce dcsão as 2 calculadoras que usarei frequentemente quando precisar de acesso a partir de um terminal.

Exemplos

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 

Então você pode digitar suas perguntas:

2
2
5+5
10

Quando terminar, você pode sair com um Ctrl+ C.

Passeio de teste

Essas calculadoras são bastante ricas em recursos.

escala

scale=5
193 * 1/3
64.33333

equações

principal=100
ir = 0.05
years = 5
futurevalue = principal * (1 + ir)^years

futurevalue
127.62800

seus exemplos

8*6-4
44

8*(6-4)
16

calc

Se você quer algo um pouco mais interativo, existe calc.

Exemplo

$ calc
C-style arbitrary precision calculator (version 2.12.4.4)
Calc is open software. For license details type:  help copyright
[Type "exit" to exit, or "help" for help.]

; 10+10
20
; 8*6-4
    44
; 8*(6-4)
    16
; 

Você pode usar as setas para cima / para baixo para passar por comandos anteriores e também possui ajuda interativa.

; help

Dá-lhe isso:

For more information while running calc, type  help  followed by one of the
following topics:

    topic               description
    -----               -----------
    intro               introduction to calc
    overview            overview of calc
    help                this file

    assoc               using associations
    builtin             builtin functions
    command             top level commands
    config              configuration parameters
    custom              information about the custom builtin interface
    define              how to define functions
    environment         how environment variables effect calc
    errorcodes          calc generated error codes
    expression          expression sequences
    file                using files
    history             command history
    interrupt           how interrupts are handled
    list                using lists
    mat                 using matrices
    ...

Referências

slm
fonte
Como essa não é uma pergunta específica do Ubuntu, talvez faça um link para o calc upstream em vez de para o pacote Ubuntu?
mattdm
@mattdm - obrigado acrescentou esse link, deixei o outro link simplesmente porque eu estava ligando para uma página de manual no calc, não necessariamente o pacote ubuntu.
slm
6

Há muitas respostas para sua pergunta ...

Os mais simples que você pode fazer no shell.

$ echo $((8*(6-4)))
16

Como um programa dedicado existe bc.

$ echo "8*(6-4)" | bc
16

Funções personalizadas via script? Bem, scripts de shell e bc os possuem, de certa forma. Depende de quão longe você deseja levá-lo.

Por que não Python? É fácil de aprender.

$ python
>>> from math import atan
>>> 8*(6-4)+atan(0)
16.0
frostschutz
fonte
Ultimamente, tenho usado o Python para isso, mas é por isso que quero outra coisa. Fica irritante ter que importar algo para todas as funções. Eu esperava mais por algo independente, como o Speedcrunch ( i.imgur.com/Cn6GejG.png ), mas a linha de comando obviamente.
Lucas Phillips
1
Você pode resolver o problema de importação definindo a variável de ambiente PYTHONSTARTUP e pré-importando itens no arquivo apontado pela variável.
Mkc
5

Em zsh:

$ autoload zcalc  # best in ~/.zshrc
$ zcalc
1> 8*(6-4)
16
2> $1*2
32
Stéphane Chazelas
fonte
4

O insect tem versões baseadas na web e em terminais:

exemplo de uso de insetos

shark.dp
fonte
2

Maxima CAS :

   L (t): = exp (% i * t * 2 *% pi); / * círculo unitário parametrizado com ângulo em turnos * /
   plot2d (
   [atan2 (parte imaginária (L (x)), parte real (L (x))]],
   [x 0,1]
   [y, -2 *% pi, 2 *% pi],
   [plot_format, gnuplot],
   [gnuplot_term, "png"],
   [gnuplot_out_file, "atan2.png"],
   [legenda, "atan2"],
   [xlabel, "ângulo em radianos"], 
   [ylabel, "ângulo em radianos"],
   [gnuplot_preamble ",
   definir chave esquerda superior;
   set xtics ('pi / 2' 0,25, 'pi' 0,5, '3pi / 2' 0,75, '2pi' 1,0);
   set ytics ('-2pi' -6,283, '-pi' -3,1415, '-pi / 2' -1,5708, '0' 0, 'pi / 2' 1,5708, 'pi' 3,1415, '2pi' 6,283);
   definir grade xtics ytics "]
  );

HTH

Adão
fonte
1

Aqui está um pequeno hack do bash que permitirá que você faça aritmética simples diretamente na linha de comando.

alias calc='set -o noglob; docalc'
function docalc { perl -e "print STDOUT $*, \"\\n\""; set +o noglob; }

Então você pode fazer, por exemplo,

calc 3 * 15 + 5

Infelizmente, ele não funciona bem com parênteses. (Se bem me lembro, você pode fazer com que o tcsh os aceite também, mas não consegui convencer o bash a fazê-lo.)

PS. Você pode confiar no bash para a aritmética, substituindo a perlchamada por echo $(( $* )); mas isso lhe dará uma divisão inteira para 5/6, etc. A aritmética de Perl é mais útil.

Alternativa: se você precisa apenas de carne com python import math, o seguinte é seu amigo:

% alias calc='python -i -c "from math import *"'
% calc
>>> 5 * atan(0.25)
alexis
fonte
0

Uma outra maneira é usar um intérprete como o Python 3:

$ python3
> from math import *
> 213/53*exp(0.8)/asin(3)
9.645423462356044

Tenha a vantagem de cmathpoder criar um script de tudo, já existem muitas funções (você também pode importar se precisar de números complexos), não precisa definir nenhuma precisão para a maioria dos casos e o python já está instalado na maioria das instalações do Linux.

O Python 3.x é melhor para uma calculadora genérica que o Python 2.x, porque o Python 3.x faz divisões de ponto flutuante se o resultado não for int.

$ python3
> 3/2
1.5
$ python2
> 3/2
1

A principal desvantagem, pelo menos para mim, é que os carros alegóricos não são impressos na notação científica se não forem muito grandes ou pequenos, sem uma string de formato:

> exp(35)
1586013452313430.8
> "{:e}".format(exp(35))
'1.586013e+15'
12431234123412341234123
fonte