Solucionador de expresiones de línea de comando?

8

Estoy buscando una calculadora basada en TTY compatible con Linux. Por ejemplo:

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

¿Hay algo como esto que admita operaciones básicas, algunas funciones integradas como atan(), y posiblemente funciones personalizadas a través de secuencias de comandos?

Lucas Phillips
fuente

Respuestas:

7

bc y dc

bcy dcson las 2 calculadoras que usaré a menudo cuando necesite acceso desde una terminal.

Ejemplos

$ 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'. 

Luego puede escribir sus preguntas:

2
2
5+5
10

Cuando haya terminado, puede salir con un Ctrl+ C.

Prueba de conducción

Estas calculadoras son bastante ricas en funciones.

escalada

scale=5
193 * 1/3
64.33333

ecuaciones

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

futurevalue
127.62800

tus ejemplos

8*6-4
44

8*(6-4)
16

calc

Si quieres algo un poco más interactivo hay calc.

Ejemplo

$ 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
; 

Puede usar las flechas arriba / abajo para ver los comandos anteriores y también tiene ayuda interactiva.

; help

Te da esto:

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
    ...

Referencias

slm
fuente
Como esta no es una pregunta específica de Ubuntu, ¿tal vez se vincule a calc upstream en lugar de al paquete de Ubuntu?
mattdm
@mattdm - gracias agregó ese enlace, dejé el otro enlace simplemente porque estaba enlazando a una página de manual en calc, no necesariamente el paquete ubuntu.
slm
6

Hay muchas respuestas a su pregunta ...

Los simples que podrías hacer en el shell.

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

Como un programa dedicado existe bc.

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

Funciones personalizadas a través de secuencias de comandos? Bueno, los scripts de shell y bc los tienen, de alguna manera. Depende de qué tan lejos quieras llevarlo.

¿Por qué no Python? Es facil de aprender.

$ python
>>> from math import atan
>>> 8*(6-4)+atan(0)
16.0
Frostschutz
fuente
De hecho, he estado usando Python para esto últimamente, pero esa es la razón por la que quiero algo más. Se vuelve molesto tener que importar algo para cada función. Esperaba más algo autónomo, como Speedcrunch ( i.imgur.com/Cn6GejG.png ), pero obviamente la línea de comando.
Lucas Phillips
1
Puede resolver el problema de importación definiendo la variable de entorno PYTHONSTARTUP y preimportando cosas en el archivo señalado por la variable.
mkc
5

En zsh:

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

Insecto tiene versiones basadas en web y en terminal:

ejemplo de uso de insectos

shark.dp
fuente
2

Maxima CAS :

   L (t): = exp (% i * t * 2 *% pi); / * círculo unitario parametrizado con ángulo en vueltas * /
   plot2d (
   [atan2 (imagpart (L (x)), realpart (L (x)))],
   [x, 0,1],
   [y, -2 *% pi, 2 *% pi],
   [plot_format, gnuplot],
   [gnuplot_term, "png"],
   [gnuplot_out_file, "atan2.png"],
   [leyenda, "atan2"],
   [xlabel, "ángulo en radianes"], 
   [ylabel, "ángulo en radianes"],
   [gnuplot_preamble, "
   configurar la tecla arriba a la izquierda;
   establecer xtics ('pi / 2' 0.25, 'pi' 0.5, '3pi / 2' 0.75, '2pi' 1.0);
   establecer ytics ('-2pi' -6.283, '-pi' -3.1415, '-pi / 2' -1.5708, '0' 0, 'pi / 2' 1.5708, 'pi' 3.1415, '2pi' 6.283);
   establecer cuadrícula xtics ytics "]
  );

HTH

Adán
fuente
1

Aquí hay un pequeño truco de bash que te permitirá hacer operaciones aritméticas simples directamente en la línea de comandos.

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

Entonces puedes hacer, por ejemplo,

calc 3 * 15 + 5

Lamentablemente no funciona bien con paréntesis. (Si no recuerdo mal, puedes hacer que tcsh los acepte también, pero no podría persuadir a bash para que lo haga).

PD. Puede confiar en bash para la aritmética, reemplazando la perlllamada con echo $(( $* )); pero eso le dará división entera para 5/6, etc. La aritmética de Perl es más útil.

Alternativa: si lo único que necesita es carne de res con pitón import math, el siguiente es su amigo:

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

Otra forma es usar un intérprete como Python 3:

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

Tenga la ventaja de que puede escribir todo, ya hay muchas funciones (también podría importar cmathsi necesita números complejos), no necesita establecer ninguna precisión para la mayoría de los casos y Python ya está instalado en la mayoría de las instalaciones de Linux.

Python 3.x es mejor para una calculadora genérica que Python 2.x, porque Python 3.x realiza divisiones de coma flotante si el resultado no es un int.

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

El principal inconveniente, al menos para mí, es que los flotadores no se imprimen en la notación científica si no son muy grandes o pequeños, sin una cadena de formato:

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