Cálculos desde la línea de comandos usando bc
Artículo original en inglés
Si como yo, haceis la mayoría de trabajo desde la línea de comandos, usando vim para editar ficheros, mutt para el correo electrónico, cd/ls/mv/find/etc en lugar de un gestor de ficheros, entonces os molestará tener que usar una calculadora GUI para hacer mayormente cálculos simples.
Una característica útil de calcular desde la línea de comandos es que puedes ver lo que has escrito. Por ejemplo, algunas veces cuando entramos un cálculo complejo y largo (tanto GUI como en la calculadora de mano), algunas veces olvidamos si hemos introducido todos los números o hecho los cálculos en el orden correcto.
Este artículo muestra cómo efectuar cálculos estándar en la línea de comandos incluyendo suma, resta, multiplicación, división, raiz cuadrada, potencias, conversión de decimal a hex, decimal a binario, hex a decimal, y binario a decimal. También introduce brevemente usando bc en modo interactivo y como escribir ficheros para usar con bc para operaciones frecuentemente repetidas. Hay una mención al uso de Google para realizar cálculos. Termina con un pequeño reto para testear el poder de tu CPU.
Otras ventajas de usar bc:
bcse incluye con (todas?) las distribuciones Linux como estándar, así como (otra vez, casi todas) las Unix.- Los resultados de cálculos en algunos formatos propietarios de
bctienen hasta 99 dígitos decimales antes y después del punto decimal. Este límite se ha superado mucho en GNUbc. No se cuál es el límite, pero al menos muchas, muchas decenas de miles. Ciertamente es más que cualquieri calculadora basada en GUI de las que he usado. - Te encuentras a tí mismo trabajando en un entorno donde simplemente no tienes acceso a GUI.
- La sintaxis para sumas básicas es casi idéntica a la función de calculadora de Google, con lo que puedes aprender como usar dos utilidades de una sola vez!
bc es un preprocesador para dc. Lo útil sobre bc es que acepta como entrada desde ficheros y desde entrada estándar. Esto nos permite dirigir los datos para hacer cálculos rápidos.
Suma
$ echo '57+43' | bc100
Resta
$ echo '57-43' | bc14
Multiplicación
$ echo '57*43' | bc2451
scale
La variablescale determina el número de dígitos que siguen al punto decimal en tu resultado. Por defecto, el valor de la variable scale es cero. (Salvo que usemos la opción -l en cuyo caso por defecto vale 20 posiciones decimales. Más sobre -l más adelante.) Esto se puede configurar declarando scale antes de hacer los cálculos, como en el siguiente ejemplo de división:
División
$ echo 'scale=25;57/43' | bc1.3255813953488372093023255
Raiz cuadrada
$ echo 'scale=30;sqrt(2)' | bc1.414213562373095048801688724209Esto supera a la función calculadora de Google la cual solo calcula el resultado con 8 posiciones decimales. A pesar de que esta función de calculadora de Google tiene esta limitación de 8 posiciones decimales, permite números imaginarios como respuestas.
Potencia
$ echo '6^6' | bc46656
Paréntesis
Si habeis leído "El número de la Bestia" de Robert Heinlein, recordareis que el número de universos paralelos en la historia es igual (seis elevado a seis) a la potencia de seis. Si intentamos calcular esto: $ echo '6^6^6' | bc Obtendremos una pantalla llena de números (unos 37374 dígitos), en lugar del10314424798490535546171949056que esperábamos. Si estamos usando una versión no-GNU de
bc, seguramente obtendremos algo como:
exp too big empty stack save:argsLa calculadora de Google obstaculiza también '6^6^6'. Buen GNU. Esto es porque escribiste la pregunta equivocada. $ echo '(6^6)^6' | bc Mientras que lo que escribiste se interpretó como: $ echo '6^(6^6)' | bc lo que es un número completamente diferente. Por tanto la posición de los paréntesis (brackets para nosotros) es muy importante. Uso brackets para separar los diferentes componentes de mis sumas siempre que es posible, elimina cualquier posible duda de que obtenga una respuesta errónea. Considera los siguientes cálculos: $ echo '7+(6*5)' | bc $ echo '7+6*5' | bc $ echo '6*5+7' | bc Todos dan la misma respuesta, 37, pero habría escrito el primer cálculo, salvo por supuesto, si quisiera decir: $ echo '(7+6)*5' | bc O ponerlo de otra forma: $ echo '13*5' | bc lo que da 65.
obase e ibase
obase e ibase son variables especiales que definen la base de entrada y de salida.
Justifica obase valores entre 2 y 999, a pesar de que nada mayor que 16 vale la pena para mi!
Justifica ibase valores entre 2 y 16.
Algunos ejemplos lo explicarán mejor.
Convierte de decimal a hexadecimal
Aqui estamos convirtiendo 255 de base 10 a base 16: $ echo 'obase=16;255' | bcFF
Convierte de decimal a binario
Y aqui estamos convirtiendo el numero 12 de base 10 a base 2: $ echo 'obase=2;12' | bc1100Lo que me recuerda un viejo chiste: Hay 10 clases de gente en el mundo -- aquellos que entienden binario, y los que no. Lo que nos lleva al siguiente ejemplo:
Convierte de binario a decimal
Aqui estamos convirtiendo el número binario 10 a base 10 (decimal). $ echo 'ibase=2;obase=A;10' | bc2Nótese que la
obase es "A" y no "10". Lo siento, tenías que aprender algo de hexadecimal. La razón es que si hemos configurado la ibase a "2", y ahora intentamos usar "10" como valor para la obase, nos quedará en "2", porque "10" en base 2 es "2". Por lo que necesitamos usar hexadecimal para "salir" del modo binario.
Bueno, esto era para explicar el chiste; ahora un poco más mezclado:
$ echo 'ibase=2;obase=A;10000001' | bc
129
Convierte de hexadecimal a decimal
$ echo 'ibase=16;obase=A;FF' | bc255Una vez más nótese el uso de "
A" para indicar base 10, debido a que "10" en hex (base 16 - el valor ibase) es 16.
Breve introducción al modo interactivo
Podemos ejecutarbc en modo interactivo:
$ bc
Si estamos usando GNU bc, obtendremos el siguiente mensaje:
bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'.Seguido de un promt en blanco. Si queremos obtener directamente el promt en blanco, basta con usar la opción
-q , la cual arranca bc en modo silencioso, evitando la bienvenida habitual de GNU bc:
$ bc -q
Usando lo básico que hemos visto a través de los ejemplos anteriores, entramos un cálculo:
scale=5
57/43
1.32558
Y escribimos quit para salir del modo interactivo de bc.
Uso de bc con scripts del shell
Podemos usar variables conbc, lo que es muy útil en los scripts:
$ FIVE=5 ; echo "$FIVE^2" | bc
25Nótese el uso de las dobles comillas para preservar el valor de la variable
$FIVE.
Una breve introducción al uso de bc con ficheros
Usandobc con ficheros nos permite repetir cálculos complejos, una y otra vez, un poco como usar una hoja de cálculo para hacer los mismos cálculos cambiando las cantidades... pero más rápido.
Aquí hay un ejemplo sencillo:
scale=2 /* C-style comments are allowed, as are spaces */ print "nConvert Fahrenheit to Celsiusnn" print "Temperature in Fahrenheit: " ; fah = read() print "n" print "Equivalent Temperature in Celsius is: " (fah - 32.0) * 5.0 / 9.0 quitCreamos y guardamos el fichero, y luego lo ejecutamos de la siguiente forma: $ bc -q filename Convertimos Fahrenheit a Celsius Temperatura en Fahrenheit: 61 La temperatura equivalente en Celsius es: 16.11 Nótese que este ejemplo es con GNU
bc. Otras versiones (proprietarias) de bc pueden tener unos requerimientos de sintáxis más severos. Algunos bcs no permiten el uso de print o read, por ejemplo, con lo que hemos de editar nuestro fichero antes de cada cálculo. No muy útil.
Un reto rápido para tu PC (sólo GNU bc)
Si quereis testear la velocidad comparativa de vuestro PC, provad este desafío: usadbc para calcular Pi a 5000 posiciones decimales. La idea de este reto viene de este gran artículo en Geekronomicon.
Si realmente quieres colapsar tu máquina por una hora (o más), puedes probar el reto de "Pi a 25000 posiciones decimales" del antes mencionado Geekronomicon.
Primero, para poner las cosas en perspectiva, aqui hay algo de información sobre mi CPU:
$ cat /proc/cpuinfo | egrep "model name|MHz"
model name : AMD Athlon(tm) 64 Processor 3500+ cpu MHz : 2211.346Nótese el uso (abajo) del comando bc -l -q.
-l carga la libreria math requerida para el uso de "a" (arco tangente) en los cálculos para Pi. Podeis aprender más sobre las funciones de librerias de matemáticas en el manual de bc command manual.
No estoy seguro del efecto que la opción -q (modo silencioso, sin que salga el mensaje de bienvenida) tiene en nuestro test, pero no creo haga daño.
$ time echo "scale=5000; 4*a(1)" | bc -l -q
3.141592653589793238462643383279502884197169399375105820974944592307 ... ... ... 73774418426312986080998886874132604720 real 0m44.164s user 0m44.099s sys 0m0.008s44.099 segundos! No está mal. Imagino que algunos colegas de Gentoo estarán interesados en ver qué diferencias en la velocidad de
bc tienen sus optimizaciones de tiempo de compilación. FWIW, la distro que elegí es Arch Linux.
4*a(1) es una aproximación de Pi, pero es buena!
-->
Enlaces de utilidad
GNU bc manual Google's calculator functionnemrac @ 12:25
Comentarios(6) »
gracias .. me fue de mucha utilidad ..
saludos
yo mismo — 23-03-2008 - 16:08:27 GMT 2
Gracias. Te digo lo mismo que con el comentario 1. Me daba rabia usar la bc porque tenía que especificar siempre antes de empezar el número de decimales mediante "scale=...", pero ahora ya sé que si uso -l no solo cargo la libería matemática, sino que por fin puedo usar decimales sin escribir "scale".
Panama — 18-12-2008 - 11:18:03 GMT 2
La verdad es que llevaba bastante tiempo detras de aprender a usar este tipo de calculos y me lo has solucionado en un momento!
Generic Viagra — 14-12-2009 - 18:25:23 GMT 2
hola, hace unos dias estaba en la internet y vi un articulo muy parecido llamado stella, a continuación se los comparto: Stella es un emulador multiplataforma de Atari 2600 VCS, desarrollado bajo licencia GNU GPL. Estela fue desarrollado en principio para Linux por Bradford W. Mott. Tras el lanzamiento de la versión original, múltiples personas se han unido al equipo de desarrollo de Stella adaptándolo a otros sistemas operativos como AcornOS, AmigaOS, DOS, FreeBSD, IRIX, Linux, OS/2, MacOS, Unix, y Windows
El systema Atari 2600 Video Computer System (VCS), creado en 1977, fue el sistema de videojuegos más popular hasta los años 80.
generic viagra — 21-01-2010 - 21:51:16 GMT 2
Para iniciar el funcionamiento del intérprete de comandos en Windows, basta seleccionar Inicio/Ejecutar y escribir 'CMD' y pulsar Intro. De este modo se inicia una sesión utilizando el intérprete. Escribir HELP y pulsar INTRO para obtener ayuda.
En otros sistemas operativos es suficiente con escribir el nombre del intérprete, tal como bash, sh, csh o similar.
generic valtrex — 08-02-2010 - 23:38:03 GMT 2
gracias muy clara la explicacion!!!

Meneame
del.icio.us


fredf1 — 21-08-2007 - 01:43:04 GMT 2