bc(1) General Commands Manual bc(1) NOMBRE bc - Un lenguaje de calculo de precision arbitraria SINTAXIS bc [ -hlwsqv ] [opciones largas] [ fichero ... ] DESCRIPCION bc es un lenguaje que permite la ejecucion interactiva de sentencias con precision numerica arbitraria. La sintaxis es similar a la del lenguaje de programacion C. Se puede disponer de una biblioteca matematica estandar a traves de una opcion en la linea de ordenes. En ese caso, la biblioteca matematica se determina antes de procesar ningun fichero. bc comienza procesando en orden todos los ficheros dados en la linea de ordenes. Despues de que todos los ficheros hayan sido procesados, bc lee la entrada estandar. Todo el codigo es ejecutado tal y como es leido. (Si un fichero contiene una orden que detiene el procesador bc nunca leera la entrada estandar.) Esta version de bc tiene varias ampliaciones adicionales a las tradicionales implementaciones de bc y el estandar POSIX. Las opciones en la linea de ordenes pueden causar que estas extensiones impriman un aviso o sean rechazadas. Este documento describe el lenguaje aceptado por este procesador. Las ampliaciones seran identificadas como tales. OPCIONES -h, --help Print the usage and exit. -i, --interactive Force interactive mode. -l, --mathlib Selecciona la biblioteca matematica estandar. -w, --warn Da mensajes de advertencia ante las ampliaciones al bc de POSIX. -s, --standard Procesa exactamente como el lenguaje bc de POSIX. -q, --quiet No imprime el habitual mensaje de bienvenida del GNU bc. -v, --version Imprime el numero de version el copyright y sale. NUMEROS The most basic element in bc is the number. Numbers are arbitrary precision numbers. This precision is both in the integer part and the fractional part. All numbers are represented internally in decimal and all computation is done in decimal. (This version truncates results from divide and multiply operations.) There are two attributes of numbers, the length and the scale. The length is the total number of decimal digits used by bc to represent a number and the scale is the total number of decimal digits after the decimal point. For example: .000001 tiene longitud 6 y escala 6. 1935.000 tiene longitud 7 y escala 3. VARIABLES Los numeros son almacenados en dos tipos de variables, variables simples y matrices. Ambos tipos son designados por nombres. Estos nombres comienzan con una letra, seguida por cualquier numero de letras, digitos y caracteres de subrayado. Todas las letras deben ir en minusculas. (Estos nombres alfanumericos son una ampliacion. En el bc de POSIX todos los nombres son una sola letra minuscula). El tipo de variable queda claro segun el contexto ya que a todas las variables de tipo matriz les sigue unos corchetes ([]). Hay cuatro variables especiales, scale, ibase, obase y last. scale define como son tratadas los digitos tras la coma decimal en algunas operaciones. El valor por defecto de scale es 0. ibase y obase definen la base numerica de conversion para la entrada y la salida. El valor por defecto para ambos es la base 10. last (una ampliacion) es la variable en la que se guardar el ultimo numero mostrado. Todo esto sera tratado en detalle cuando proceda. Todas estas variables pueden tener un valor asignado asi como ser usadas en expresiones. COMENTARIOS Los comentarios en bc comienzan con los caracteres /* y finalizan con los caracteres */. Los comentarios pueden empezar en cualquier lugar y aparecen como un solo espacio en la entrada. (Esto hace que delimiten otros elementos de entrada. Por ejemplo, un comentario no puede encontrarse en medio del nombre de una variable). Los comentarios pueden incluir saltos de linea. Para poder usar macros (scripts) en bc, la posibilidad de incluir comentarios de una sola linea ha sido anadida como ampliacion. Estos comienzan con el caracter # y continuan hasta el final de la linea. El final de linea no es parte del comentario y es procesado de forma normal. EXPRESIONES Los numeros son manipulados por las expresiones y las sentencias. Como el lenguaje fue disenado para ser interactivo, las sentencias y expresiones son ejecutadas tan pronto como es posible. No hay programa principal ("main"). En su lugar, el codigo es ejecutado tal y como se encuentra. (Las funciones, tratadas en detalle mas abajo, se definen cuando se encuentran). A simple expression is just a constant. bc converts constants into internal decimal numbers using the current input base, specified by the variable ibase. (There is an exception in functions.) The valid values for ibase are 2 through 36. (Bases greater than 16 are an extension.) Assigning a value outside this range to ibase will result in a value of 2 or 36. Input numbers may contain the characters 0-9 and A-Z. (Note: They must be capitals. Lower case letters are variable names.) Single digit numbers always have the value of the digit regardless of the value of ibase. (i.e. A = 10.) For multi-digit numbers, bc changes all input digits greater or equal to ibase to the value of ibase-1. This makes the number ZZZ always be the largest 3 digit number of the input base. Las expresiones mas complejas son similares a muchos otros lenguajes de alto nivel. Como solo hay un tipo de numero, no hay reglas para mezclar tipos. En cambio, hay reglas para la escala de las expresiones. Cada expresion tiene una escala. Esta es derivada de la escala de los numeros originales, la operacion realizada y, en muchos casos, el valor de la variable scale. Los valores permitidos para scale son desde 0 hasta el maximo numero representable por un entero en C. In the following descriptions of valid expressions, "expr" refers to a complete expression and "var" refers to a simple or an array variable. A simple variable is just a nombre y una matriz se designa asi nombre[expr] Si no se especifica la escala del resultado, esta sera la maxima escala de las expresiones implicadas. - expr El resultado es la expresion negada. ++ var La variable es incrementada en uno y el nuevo valor es el resultado de la expresion. -- var La variable es decrementada en uno y el nuevo valor es el resultado de la expresion. var ++ The result of the expression is the value of the variable and then the variable is incremented by one. var -- El resultado de la expresion es el valor de la variable y entonces la variable es decrementada en uno. expr + expr El resultado de la expresion es la suma de las dos expresiones. expr - expr El resultado de la expresion es la diferencia de las dos expresiones. expr * expr El resultado de la expresion es el producto de las dos expresiones. expr / expr El resultado de la expresion es el cociente de las dos expresiones. La escala del resultado es el valor de la variable scale. expr % expr El resultado de la expresion es el "resto" y se calcula de la siguiente manera. Para calcular a%b, primero se calcula a/b en scale digitos. Este resultado es usado para calcular a-(a/b)*b a la escala que resulte mayor, scale+scale(b) o scale(a). Si scale vale cero y ambas expresiones son enteros esta expresion calcula el resto entero. expr ^ expr The result of the expression is the value of the first raised to the second. The second expression must be an integer. (If the second expression is not an integer, a warning is generated and the expression is truncated to get an integer value.) The scale of the result is scale if the exponent is negative. If the exponent is positive the scale of the result is the minimum of the scale of the first expression times the value of the exponent and the maximum of scale and the scale of the first expression. (e.g. scale(a^b) = min(scale(a)*b, max( scale, scale(a))).) It should be noted that expr^0 will always return the value of 1. ( expr ) Altera la precedencia estandar para forzar la evaluacion de la expresion. var = expr Se asigna a la variable el valor de la expresion. var = expr Es equivalente a "var = var expr" con la excepcion de que "var" solo es evaluada una vez. Esto puede afectar si "var" es una matriz. Relational expressions are a special kind of expression that always evaluate to 0 or 1, 0 if the relation is false and 1 if the relation is true. These may appear in any valid expression. (POSIX bc requires that relational expressions are used only in if, while, and for statements and that only one relational test may be done in them.) The relational operators are expr1 < expr2 El resultado es 1 si expr1 es estrictamente menor que expr2. expr1 <= expr2 El resultado es 1 si expr1 es menor o igual que expr2. expr1 > expr2 El resultado es 1 si expr1 es estrictamente mayor que expr2. expr1 >= expr2 El resultado es 1 si expr1 es mayor o igual que expr2. expr1 == expr2 El resultado es 1 si expr1 es igual a expr2. expr1 != expr2 El resultado es 1 si expr1 no es igual a expr2. Boolean operations are also valid. (POSIX bc does NOT have boolean operations). The result of all boolean operations are 0 and 1 (for false and true) as in relational expressions. The boolean operators are: !expr El resultado es 1 si expr es 0. expr && expr El resultado es 1 si ambas expresiones son distintas de 0. expr || expr El resultado es 1 si alguna de las expresiones es distinta de 0. La precedencia de las expresiones es la siguiente (de menor a mayor): operador || , asociativo por la izquierda operador && , asociativo por la izquierda operador ! , no asociativo operadores relacionales, asociativos por la izquierda operador asignacion, asociativo por la derecha operadores + y - , asociativos por la izquierda operadores *, / y % , asociativos por la izquierda operador ^ , asociativo por la derecha operador unario - , no asociativo operadores ++ y -- , no asociativo Esta precedencia fue elegida para que los programas acordes con el bc de POSIX funcionaran correctamente. Esto hara que el uso de operadores relacionales y logicos tenga un comportamiento inusual cuando se usen con expresiones de asignacion. Considere la expresion: a = 3 < 5 La mayoria de los programadores de C asumirian que se asignaria el resultado de "3 < 5" (el valor 1) a la variable "a". Lo que ocurre en bc es que se asigna el valor 3 a la variable "a" y entonces se compara 3 con 5. Es mejor usar parentesis cuando se usan operadores relacionales y logicos con operadores de asignacion. Hay algunas expresiones especiales mas en bc. Estas estan relacionadas con las funciones definidas por el usuario y las funciones estandar. Tienen la forma "nombre(parametros)". Las funciones definidas por el usuario son tratadas en la seccion FUNCIONES. Las funciones estandar son: length ( expresion ) EL valor de la funcion length es el numero de digitos significativos en la expresion. read ( ) La funcion read (una ampliacion) leera un numero de la entrada estandar, independientemente del lugar donde aparezca la funcion. Tenga cuidado pues esto puede causar problemas mezclando datos y programa en la entrada estandar. El mejor uso de esta funcion es ponerla en un programa previamente escrito que necesite la entrada del usuario, pero nunca permitiendo que el usuario introduzca codigo de programa. El valor de la funcion read es el numero leido de la entrada estandar usando el valor de la variable ibase para la base de conversion. scale ( expresion ) El valor de la funcion scale es el numero de digitos tras la coma decimal en la expresion. sqrt ( expresion ) El valor de la funcion sqrt es la raiz cuadrada de la expresion. Si la expresion es negativa, se genera un error en tiempo de ejecucion. SENTENCIAS Statements (as in most algebraic languages) provide the sequencing of expression evaluation. In bc statements are executed "as soon as possible". Execution happens when a newline in encountered and there is one or more complete statements. Due to this immediate execution, newlines are very important in bc. In fact, both a semicolon and a newline are used as statement separators. An improperly placed newline will cause a syntax error. Because newlines are statement separators, it is possible to hide a newline by using the backslash character. The sequence "\", where is the newline appears to bc as whitespace instead of a newline. A statement list is a series of statements separated by semicolons and newlines. The following is a list of bc statements and what they do: (Things enclosed in brackets ([]) are optional parts of the statement.) expresion This statement does one of two things. If the expression starts with " ...", it is considered to be an assignment statement. If the expression is not an assignment statement, the expression is evaluated and printed to the output. After the number is printed, a newline is printed. For example, "a=1" is an assignment statement and "(a=1)" is an expression that has an embedded assignment. All numbers that are printed are printed in the base specified by the variable obase. The valid values for obase are 2 through BC_BASE_MAX. (See the section LIMITS.) For bases 2 through 16, the usual method of writing numbers is used. For bases greater than 16, bc uses a multi-character digit method of printing the numbers where each higher base digit is printed as a base 10 number. The multi-character digits are separated by spaces. Each digit contains the number of characters required to represent the base ten value of "obase-1". Since numbers are of arbitrary precision, some numbers may not be printable on a single output line. These long numbers will be split across lines using the "\" as the last character on a line. The maximum number of characters printed per line is 70. Due to the interactive nature of bc, printing a number causes the side effect of assigning the printed value to the special variable last. This allows the user to recover the last value printed without having to retype the expression that printed the number. Assigning to last is valid and will overwrite the last printed value with the assigned value. The newly assigned value will remain until the next number is printed or another value is assigned to last. (Some installations may allow the use of a single period (.) which is not part of a number as a short hand notation for last.) cadena Se imprime la cadena en la salida. Las cadenas comienzan con una comilla doble y contienen todos los caracteres hasta la siguiente comilla doble. Todos los caracteres son tomados literalmente, incluidos los cambios de linea. Tras la cadena no se cambia de linea. print lista La sentencia print (una ampliacion) proporciona otro metodo de impresion. La "lista" es una lista de cadenas y expresiones separadas por comas. La lista se imprime en el orden en el que esta. Tras la lista no se cambia de linea. Las expresiones son evaluadas y sus valores impresos y asignados a la variable last. Las cadenas se imprimen en la salida y pueden contener caracteres especiales. Los caracteres especiales comienzan con el caracter de contra-barra (\). bc reconoce los caracteres especiales "a" (alerta o campana), "b" (borrar caracter (backspace)), "f" (salto de linea), "n" (nueva linea), "r" (retorno de carro), "q" (comilla doble), "t" (tabulador), y "\" (contra-barra). Cualquier otro caracter que siga a una contra-barra sera ignorado. { lista_de_sentencias } Esta es la sentencia compuesta. Permite ejecutar varias sentencias agrupadas. if ( expresion ) sentencia1 [else sentencia2] Esta sentencia evalua la expresion y ejecuta la sentencia1 o la sentencia2 dependiendo del valor de la expresion. Si el valor es distinto de 0, se ejecuta la sentencia1. Si se da la sentencia2 y el valor de la expresion es 0, entonces se ejecuta la sentencia2. (La clausula else es una ampliacion). while ( expresion ) sentencia Se ejecuta la sentencia mientras la expresion sea distinta de 0. Se evalua la expresion antes de cada ejecucion de la sentencia. El bucle termina al tomar la expresion el valor 0 o ante una sentencia break. for ( [expresion1] ; [expresion2] ; [expresion3] ) sentencia La sentencia for controla la ejecucion repetitiva de la sentencia. La expresion1 es evaluada antes del bucle. La expresion2 es evaluada antes de cada ejecucion de la sentencia. Si es 0, el bucle termina. Despues de cada ejecucion de la sentencia, se evalua la expresion3 antes de reevaluar la expresion2. Si la expresion1 o la expresion3 no se dan, no se evalua nada en su lugar. Si la expresion2 no se da, es lo mismo que sustituirla por el valor 1. (El que las expresiones sean opcionales es una ampliacion. El bc de POSIX requiere las tres expresiones). Este es el codigo equivalente para la sentencia for: expresion1; while (expresion2) { sentencia; expresion3; } break Esta sentencia fuerza la salida de la sentencia while o for mas reciente. continue La sentencia continue (una ampliacion) provoca que la sentencia for mas reciente comience una nueva iteracion. halt La sentencia halt (una ampliacion) provoca que el procesador bc termine solo cuando es ejecutada. Por ejemplo, "if (0 == 1) halt" no hara que bc termine porque no llega a ejecutarse la sentencia halt. return Devuelve el valor 0 desde una funcion. (Ver seccion sobre funciones). return ( expresion ) Return the value of the expression from a function. (See the section on functions.) As an extension, the parenthesis are not required. PSEUDO SENTENCIAS Estas sentencias no son sentencias en el sentido tradicional. No son sentencias que se ejecuten. Su funcion se realiza en "tiempo de compilacion". limits Imprime los limites locales forzados por la version local de bc. Esto es una ampliacion. quit Cuando la sentencia quit se lee, el procesador bc termina, cualquiera que sea el lugar donde se encuentre la sentencia quit. Por ejemplo, "if (0 == 1) quit" hara que bc termine. warranty Imprime un aviso largo sobre la garantia. Esto es una ampliacion. FUNCIONES Las funciones proporcionan un metodo para definir un calculo que sera ejecutado mas tarde. Las funciones en bc siempre calculan un valor que devuelven a quien la ha llamado. La definicion de las funciones son "dinamicas" en el sentido de que una funcion esta indefinida hasta que se encuentra una definicion en la entrada. Se usa esa definicion hasta que se encuentra otra definicion de funcion con el mismo nombre. La nueva definicion reemplaza a la anterior. Una funcion se define como sigue: define nombre ( parametros ) { nueva_linea auto_lista lista_de_sentencias } La ejecucion de una funcion es simplemente una expresion de la forma "nombre(parametros)". Parameters are numbers or arrays (an extension). In the function definition, zero or more parameters are defined by listing their names separated by commas. All parameters are call by value parameters. Arrays are specified in the parameter definition by the notation "name[]". In the function call, actual parameters are full expressions for number parameters. The same notation is used for passing arrays as for defining array parameters. The named array is passed by value to the function. Since function definitions are dynamic, parameter numbers and types are checked when a function is called. Any mismatch in number or types of parameters will cause a runtime error. A runtime error will also occur for the call to an undefined function. La auto_lista es una lista opcional de variables para uso "local". La sintaxis de esta lista (si se da) es "auto nombre, ... ;". (El punto y coma es opcional). Cada nombre es el nombre de una variable auto. Las matrices se pueden especificar con la misma notacion que se usa en los parametros. Los valores de estas variables se guardan en una pila al comienzo de la funcion. Entonces son inicializadas a cero y se usan en el transcurso de la funcion. Al finalizar la funcion, se recuperan de la pila los valores originales (en el momento de la llamada a la funcion). Los parametros son realmente variables auto que se inicializan al valor proporcionado en la llamada a la funcion. Las variables auto son diferentes de las tradicionales variables locales en que si la funcion A llama a la funcion B, B puede acceder a las variables auto de A simplemente usando sus nombres, a no ser que la funcion B tenga variables auto del mismo nombre. Como tanto las variables auto como los parametros son guardados en una pila, bc admite funciones recursivas. El cuerpo de la funcion es una lista de sentencias de bc. De nuevo las sentencias van separadas por punto y coma o cambio de linea. La sentencia return hace que la funcion termine y devuelva un valor a la expresion que ha llamado a la funcion.. La primera forma, "return", devuelve el valor 0. La segunda forma "return ( expresion )", calcula el valor de la expresion y lo devuelve a la expresion que ha llamado la funcion. Hay un "return (0)" implicito al final de cada funcion. Esto permite a una funcion terminar y devolver 0, sin necesidad de una sentencia return explicita. Las funciones tambien cambian el uso de la variable ibase. Todas las constantes en el cuerpo de la funcion son convertidas usando el valor de ibase en el momento de llamar a la funcion. Los cambios de ibase seran ignorados durante la ejecucion de la funcion excepto para la funcion estandar read, que siempre usara el valor actual de ibase para la conversion de los numeros. Several extensions have been added to functions. First, the format of the definition has been slightly relaxed. The standard requires the opening brace be on the same line as the define keyword and all other parts must be on following lines. This version of bc will allow any number of newlines before and after the opening brace of the function. For example, the following definitions are valid. define d (n) { return (2*n); } define d (n) { return (2*n); } Functions may be defined as void. A void funtion returns no value and thus may not be used in any place that needs a value. A void function does not produce any output when called by itself on an input line. The key word void is placed between the key word define and the function name. For example, consider the following session. define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<--- Since py is not a void function, the call of py(1) prints the desired output and then prints a second line that is the value of the function. Since the value of a function that is not given an explicit return statement is zero, the zero is printed. For px(1), no zero is printed because the function is a void function. Also, call by variable for arrays was added. To declare a call by variable array, the declaration of the array parameter in the function definition looks like "*name[]". The call to the function remains the same as call by value arrays. BIBLIOTECA MATEMATICA Si se invoca bc con la opcion -l, una biblioteca matematica es pre-cargada y la escala por defecto se pone a 20. Las funciones matematicas calcularan sus resultados a la escala definida en el momento de su llamada. La biblioteca matematica define las siguientes funciones: s (x) El seno de x, con x en radianes. c (x) El coseno de x, con x en radianes. a (x) El arcotangente de x, con el resultado en radianes. l (x) El logaritmo natural de x. e (x) La funcion exponencial resultante de elevar e al valor de x. j (n,x) La funcion Bessel de orden entero n de x. EJEMPLOS En /bin/sh, lo siguiente asignara el valor de "pi" a la variable shell pi. pi=$(echo "scale=10; 4*a(1)" | bc -l) Lo siguiente es la definicion de la funcion exponencial usada en la biblioteca matematica. Esta funcion esta escrita en bc de POSIX. scale = 20 /* Uses the fact that e^x = (e^(x/2))^2 When x is small enough, we use the series: e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Check the sign of x. */ if (x<0) { m = 1 x = -x } /* Precondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* Initialize the variables. */ v = 1+x a = x d = 1 for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } } El siguiente codigo usa las caracteristicas ampliadas de bc para implementar un simple programa para calcular balances. Es mejor guardar este programa en un fichero para poderlo usar varias veces sin tener que teclearlo cada vez. scale=2 print "\nCheck book program!\n" print " Remember, deposits are negative transactions.\n" print " Exit by a 0 transaction.\n\n" print "Initial balance? "; bal = read() bal /= 1 print "\n" while (1) { "current balance = "; bal "transaction? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit Lo siguiente es la definicion de la funcion factorial recursiva. define f (x) { if (x <= 1) return (1); return (f(x-1) * x); } OPCIONES READLINE Y LIBEDIT GNU bc can be compiled (via a configure option) to use the GNU readline input editor library or the BSD libedit library. This allows the user to do editing of lines before sending them to bc. It also allows for a history of previous lines typed. When this option is selected, bc has one more special variable. This special variable, history is the number of lines of history retained. For readline, a value of -1 means that an unlimited number of history lines are retained. Setting the value of history to a positive number restricts the number of history lines to the number given. The value of 0 disables the history feature. The default value is 100. For more information, read the user manuals for the GNU readline, history and BSD libedit libraries. One can not enable both readline and libedit at the same time. DIFERENCIAS This version of bc was implemented from the POSIX P1003.2/D11 draft and contains several differences and extensions relative to the draft and traditional implementations. It is not implemented in the traditional way using dc(1). This version is a single process which parses and runs a byte code translation of the program. There is an "undocumented" option (-c) that causes the program to output the byte code to the standard output instead of running it. It was mainly used for debugging the parser and preparing the math library. Una mayor fuente de diferencias son las ampliaciones, tanto cuando son anadidas para dar mas funcionalidad como cuando anaden nuevas caracteristicas. Esta es la lista de las diferencias y ampliaciones. LANG environment Esta version no se ajusta al estandar POSIX sobre el proceso de la variable de entorno LANG y todas las variables de entorno que comienzan por LC_. nombres El bc tradicional y el de POSIX usan nombres de una sola letra para funciones, variables y matrices. Han sido ampliados para ser nombres multi-caracter que comienzan por una letra y pueden contener letras, digitos y caracteres de subrayado. Cadenas No se permite que las cadenas contengan caracteres nulos (NUL). El estandar POSIX dice que todos los caracteres se deben incluir en las cadenas. last En el bc de POSIX no existe la variable last. Algunas implementaciones de bc usan el punto (.) de manera similar. comparaciones El bc de POSIX permite las comparaciones solo en la sentencia if, la sentencia while y la segunda expresion de la sentencia for. Ademas, solo se permite una operacion relacional en cada una de estas sentencias. sentencia if, clausula else El bc de POSIX no tiene la clausula else. sentencia for El bc de POSIX obliga a que esten todas las expresiones de la sentencia for. &&, ||, ! El bc de POSIX no tiene los operadores logicos. funcion read El bc de POSIX no tiene la funcion read. sentencia print El bc de POSIX no tiene la sentencia print. sentencia continue El bc de POSIX no tiene la sentencia continue. return statement POSIX bc requires parentheses around the return expression. parametros de tipo matriz El bc de POSIX (actualmente) no admite totalmente las matrices como parametros. La gramatica POSIX permite incluir matrices en la definicion de las funciones, pero no proporciona un metodo para especificar una matriz como parametro en la llamada. (Se puede considerar esto como un error de la gramatica). En las implementaciones tradicionales de bc solo se pueden usar las matrices como parametros por valor. function format POSIX bc requires the opening brace on the same line as the define key word and the auto statement on the next line. =+, =-, =*, =/, =%, =^ El bc de POSIX no define estos operadores de asignacion "al viejo estilo". Esta version puede que las permita. Utilice la sentencia limits para ver si la version instalada las admite. Si se admiten, la sentencia "a =- 1" decrementara a en 1 en lugar de asignar a a el valor -1. espacios en los numeros Otras implementaciones de bc permiten espacios en los numeros. Por ejemplo, "x=1 3" asignaria a la variable x el valor 13. La misma sentencia provocara un error de sintaxis en esta version de bc. errores y ejecucion Esta implementacion varia de otras implementaciones en el tema de que codigo se ejecutara cuando en el programa se encuentren errores sintacticos o de otro tipo. Si en la definicion de una funcion se encuentra un error sintactico, se intenta recuperar el error encontrando el principio de la sentencia y continuando con el analisis de la funcion. Una vez que el error se encuentra en la funcion, la funcion no podra usarse y queda indefinida. Los errores sintacticos en la ejecucion de codigo interactivo invalidaran el actual bloque en ejecucion. El bloque en ejecucion acaba con un salto de linea tras una secuencia completa de sentencias. Por ejemplo, a = 1 b = 2 tiene dos bloques y { a = 1 b = 2 } tiene un bloque. Cualquier error en tiempo de ejecucion terminara con el actual bloque en ejecucion. Un mensaje de aviso (warning) en tiempo de ejecucion no terminara con el actual bloque en ejecucion. Interrupciones Durante una sesion interactiva, la senal SIGINT (habitualmente generada por el caracter control-C desde el terminal) provocara la interrupcion del actual bloque en ejecucion. Se mostrara un error en tiempo de ejecucion indicando que funcion fue interrumpida. Despues de limpiar todas las estructuras, se muestra un mensaje al usuario para indicarle que bc esta listo para aceptar mas entrada. Todas las funciones definidas previamente permanecen definidas y las variables que no sean del tipo auto conservan el valor que tenian en el momento de la interrupcion. Durante una sesion no-interactiva, la senal SIGINT interrumpira la ejecucion de bc por completo. LIMITES Los limites actualmente en vigor para este procesador bc son los siguientes. Algunos de ellos pueden haber cambiado en el proceso de instalacion. Utilice la sentencia limits para ver sus valores actuales. BC_BASE_MAX The maximum output base is at least 10^9. The maximum input base is 16. BC_DIM_MAX Tal y como se distribuye, este limite se inicializa arbitrariamente a 65535. En su instalacion puede ser diferente. BC_SCALE_MAX El numero de digitos tras la coma decimal se limita a INT_MAX digitos. De igual manera, el numero de digitos delante de la coma decimal se limita a INT_MAX digitos. BC_STRING_MAX El limite para el numero de caracteres de una cadena es INT_MAX caracteres. exponente El valor del exponente en la operacion potencia (^) esta limitado a LONG_MAX. nombres de variables El limite actual para el numero de nombres unicos de variables simples, matrices y funciones es de 32767 para cada tipo. VARIABLES DE ENTORNO Las siguientes variables de entorno son procesadas por bc: POSIXLY_CORRECT Esto es lo mismo que la opcion -s. BC_ENV_ARGS Este es otra forma de pasar argumentos a bc. El formato es el mismo que los argumentos de la linea de ordenes. Estos argumentos se procesan primero, por lo que cualquier fichero presente en los argumentos de entorno es procesado antes que cualquiera que aparezca en la linea de ordenes. Esto permite al usuario establecer opciones "estandar" y los ficheros que seran procesados en todas las invocaciones de bc. Los ficheros listados en las variables de entorno generalmente contendran definiciones de funciones que el usuario quiera tener definidas cada vez que ejecute bc. BC_LINE_LENGTH This should be an integer specifying the number of characters in an output line for numbers. This includes the backslash and newline characters for long numbers. As an extension, the value of zero disables the multi-line feature. Any other value of this variable that is less than 3 sets the line length to 70. DIAGNOSTICOS Si algun fichero dado en la linea de ordenes no se puede abrir, bc informara que el fichero no esta disponible y terminara. Asimismo, hay errores en tiempo de compilacion y de ejecucion que deberian ser auto-explicativos. ERRORES La recuperacion de errores no es muy buena todavia. Notifique cualquier error a bug-bc@gnu.org. Compruebe que incluye la palabra "bc" dentro del campo "Asunto:" ("Subject:"). AUTOR Philip A. Nelson philnelson@acm.org RECONOCIMIENTOS El autor quisiera agradecer a Steve Sommars (Steve.Sommars@att.com) su gran ayuda probando la implementacion. Me dio muchas sugerencias estupendas. Este es un producto mejor gracias a su implicacion. TRADUCCION La traduccion al espanol de esta pagina del manual fue creada por J. Ramon Palacios Esta traduccion es documentacion libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD. Si encuentra algun error en la traduccion de esta pagina del manual, envie un correo electronico a . Proyecto GNU 5 Enero 2025 bc(1)