@c English version 2013-04-04
@menu
* Números::
* Cadenas de texto::
* Constantes::
* Listas::
* Arrays::
* Estructuras::
@end menu



@node Números, Cadenas de texto, Tipos de datos y estructuras, Tipos de datos y estructuras
@section Números

@menu
* Introducción a los números::
* Funciones y variables para los números::
@end menu




@node Introducción a los números, Funciones y variables para los números, Números, Números
@subsection Introducción a los números




@subheading Números enteros y racionales

Los cálculos aritméticos con números enteros y racionales son exactos.
En principio, los números enteros y racionales admiten una cantidad arbitraria
de cifras, con la única limitación que impongan las capacidades de memoria
del sistema.

@example
(%i1) 1/3+5/4+3;
                               55
(%o1)                          --
                               12
(%i2) 100!;
(%o2) 9332621544394415268169923885626670049071596826438162146859\
2963895217599993229915608941463976156518286253697920827223758251\
185210916864000000000000000000000000
(%i3) 100!/101!;
                                1
(%o3)                          ---
                               101
@end example

Funciones disponibles para los números enteros y racionales:

@verbatim
   integerp       numberp       nonnegintegerp     
   oddp           evenp
   ratnump        rationalize
@end verbatim

@subheading Números decimales en coma flotante

Maxima hace los cálculos con números decimales en coma flotante 
en doble precisión. Además, Maxima puede hacer c@'lculos con 
números decimales grandes en coma flotante (@i{bigfloats}, en inglés),
que, en principio, admiten precisión arbitraria.

La coma de los números decimales en coma flotante se escribe con un
punto y el exponente se puede indicar con "f", "e" o "d". Por defecto,
Maxima hace los cálculos en doble precisión y muestra el exponente
como "e" en el resultado, mientras que representa el exponente con la
letra "b" en el caso de decimales grandes de precisión arbitraria.
Maxima no distingue si la letra del exponente se escribe en minúscula
o mayúscula.

@example
(%i1) [2.0,1f10,1,e10,1d10,1d300];
(%o1)        [2.0, 1.e+10, 1, e10, 1.e+10, 1.e+300]
(%i2) [2.0b0,1b10,1b300];
(%o2)               [2.0b0, 1.0b10, 1.0b300]
@end example

Si en un cálculo aritmético aparece un número decimal en coma flotante,
se producirá un efecto de contagio que hará que el resultado se devuelva
también como decimal. Esto también es cierto para el caso de decimales
grandes de precisión arbitraria.

@example
(%i1) 2.0+1/2+3;
(%o1)                                 5.5
(%i2) 2.0b0+1/2+3;
(%o2)                                5.5b0
@end example

Con las funciones @code{float} y @code{bfloat} se puede convertir
un número en decimal de doble precisión, o de precisión
arbitraria, respectivamente:

@example
(%i1) float([2,1/2,1/3,2.0b0]);
(%o1)          [2.0, 0.5, .3333333333333333, 2.0]
(%i2) bfloat([2,1/2,1/3,2.0b0]);
(%o2)     [2.0b0, 5.0b-1, 3.333333333333333b-1, 2.0b0]
@end example

Funciones y variables disponibles para números decimales:

@verbatim
   float        floatnump     
   bfloat       bfloatp       fpprec
   float2bf     bftorat       ratepsilon

   number_pbranch 
   m1pbranch
@end verbatim

@subheading Números complejos

Maxima no tiene un tipo de dato especíco para
números complejos; éstos se representan internamente como
la suma de la parte real y la imaginaria multiplicada por el
símbolo @code{%i}, que hace las veces de unidad
imaginaria. Por ejemplo, las raíces de la ecuación
@code{x^2 - 4*x + 13 = 0} se representan como @code{2 + 3*%i} y
@code{2 - 3*%i}.

Maxima no simplifica automáticamente productos, cocientes,
raíces y otras expresiones con números complejos.
Por ejemplo, para hacer la multiplicación de números
complejos se puede utilizar la función @code{expand}.

Funciones disponibles para los números complejos:

@verbatim
   realpart     imagpart      rectform     polarform
   cabs         carg          conjugate    csign
@end verbatim







@node Funciones y variables para los números, , Introducción a los números, Números
@subsection Funciones y variables para los números


@deffn {Función} bfloat (@var{expr})
Convierte todos los números y  funciones numéricas a números decimales de punto flotante grandes ("bigfloats").
El número de dígitos significativos de los "bigfloats" resultantes se especifica mediante la variable global @code{fpprec}.

Si @code{float2bf} vale @code{false} se mostrará un mensaje de aviso cuando un número en punto flotante se convierte a decimal de tipo "bigfloats", puesto que tal transformación puede conllevar pérdida de precisión.

@end deffn


@deffn {Función} bfloatp (@var{expr})
Devuelve @code{true} si @var{expr} es un número decimal en punto flotante grande ("bigfloats"), en caso contrario devuelve @code{false}.

@end deffn


@defvr {Variable optativa} bftorat
Valor por defecto: @code{false}

La variable @code{bftorat} controla la conversión de números decimales de punto flotante grandes ("bigfloats") a números racionales. Si @code{bftorat} vale @code{false}, se utilizará @code{ratepsilon} para controlar la conversión  (lo cual resulta en números racionales relativamente pequeños). Si  @code{bftorat} vale @code{true}, el número racional generado representará exactamente al número decimal de punto flotante grande ("bigfloat").

@end defvr


@defvr {Variable optativa} bftrunc
Valor por defecto: @code{true}

La variable @code{bftrunc} provoca la eliminación de ceros en números decimales grandes no nulos para que no se muestren.  Así, si @code{bftrunc} vale @code{false}, @code{bfloat (1)}
se muestra como @code{1.000000000000000B0}. En otro caso, se mostrará como @code{1.0B0}.

@end defvr


@deffn {Función} evenp (@var{expr})
Devuelve @code{true} si @var{expr} es un entero par y @code{false} en cualquier otro caso.

@end deffn


@deffn {Función} float (@var{expr})
Convierte los enteros, números racionales y los decimales de punto flotante grandes ("bigfloats") que están presentes en @var{expr} a números de punto flotante. También actúa como símbolo @code{evflag}.

@end deffn


@defvr {Variable optativa} float2bf
Valor por defecto: @code{true}
 
Si @code{float2bf} vale @code{false} se mostrará un mensaje de aviso cuando un número
en punto flotante se convierte a decimal de tipo "bigfloats", puesto que tal transformación
puede conllevar pérdida de precisión.

@end defvr


@deffn {Función} floatnump (@var{expr})
Devuelve @code{true} si @var{expr} es un número de punto flotante, en caso contario retorna @code{false}.

@end deffn



@defvr {Variable optativa} fpprec
Valor por defecto: 16

La variable @code{fpprec} guarda el número de dígitos significativos en la aritmética con números decimales de punto flotante grandes ("bigfloats"). La variable @code{fpprec} no afecta a los cálculos con números decimales de punto flotante ordinarios.

Véanse también @code{bfloat} y @code{fpprintprec}.

@end defvr

@defvr {Variable optativa} fpprintprec
Valor por defecto: 0

La variable @code{fpprintprec} guarda el número de dígitos
a imprimir de los números decimales en coma flotante, tanto los ordinarios
como los de precisión ilimitada (@i{bigfloats}).

En el caso de los decimales ordinarios, si @code{fpprintprec} toma un valor
entre 2 y 16 (inclusive), el número de dígitos que se 
imprimen es igual a @code{fpprintprec}. En caso contrario, @code{fpprintprec} es 0
o mayor que 16, siendo el número de dígitos
a imprimir en todos loa casos igual a 16.

En el caso de los decimales de precisión ilimitada (@i{bigfloats}),
si @code{fpprintprec} toma un valor entre 2 y 16 (inclusive),
el número de dígitos que se imprimen es igual a 
@code{fpprintprec}. En caso contrario, @code{fpprintprec} es 0
o mayor que @code{fpprec}, siendo el número de dígitos
a imprimir igual a @code{fpprec}.

La variable @code{fpprintprec} no admite el valor 1.
@end defvr


@deffn {Función} integerp (@var{expr})

Devuelve @code{true} si @var{expr} es un número entero y @code{false} en cualquier otro caso.

La función @code{integerp} devuelve @code{false} si su argumento es un símbolo, incluso cuando éste ha sido declarado como entero.

Ejemplos:

@example
(%i1) integerp (0);
(%o1)                         true
(%i2) integerp (1);
(%o2)                         true
(%i3) integerp (-17);
(%o3)                         true
(%i4) integerp (0.0);
(%o4)                         false
(%i5) integerp (1.0);
(%o5)                         false
(%i6) integerp (%pi);
(%o6)                         false
(%i7) integerp (n);
(%o7)                         false
(%i8) declare (n, integer);
(%o8)                         done
(%i9) integerp (n);
(%o9)                         false
@end example

@end deffn


@defvr {Variable opcional} m1pbranch
Valor por defecto: @code{false}

La variable @code{m1pbranch} es la rama principal de @code{-1} elevado a una potencia. Cantidades como @code{(-1)^(1/3)} (esto es, un exponente racional impar) y @code{(-1)^(1/4)} (esto es, un exponente racional par) son tratados como sigue:

@c REDRAW THIS AS A TABLE
@example
              dominio real
                            
(-1)^(1/3):      -1         
(-1)^(1/4):   (-1)^(1/4)   

             dominio complejo              
m1pbranch:false          m1pbranch:true
(-1)^(1/3)               1/2+%i*sqrt(3)/2
(-1)^(1/4)              sqrt(2)/2+%i*sqrt(2)/2
@end example

@end defvr


@deffn {Función} nonnegintegerp (@var{n})

Devuelve @code{true} si y solo si @code{@var{n} >= 0}, siendo @var{n} un entero.

@end deffn


@deffn {Función} numberp (@var{expr})

Devuelve @code{true} si @var{expr} es un enúmero entero, racional, 
de coma flotante o "bigfloat", en caso contrario devuelve @code{false}.

La función @code{numberp} devuelve @code{false} si su argumento es un símbolo, incluso cuando el argumento es un número simbólico como @code{%pi} o @code{%i}, o aunque haya sido declarado como @code{even} (par), @code{odd} (impar), @code{integer} (entero), @code{rational} (racional), @code{irrational} (irracional), @code{real} (real), @code{imaginary} (imaginario) o @code{complex} (complejo).

Ejemplos:

@example
(%i1) numberp (42);
(%o1)                         true
(%i2) numberp (-13/19);
(%o2)                         true
(%i3) numberp (3.14159);
(%o3)                         true
(%i4) numberp (-1729b-4);
(%o4)                         true
(%i5) map (numberp, [%e, %pi, %i, %phi, inf, minf]);
(%o5)      [false, false, false, false, false, false]
(%i6) declare (a, even, b, odd, c, integer, d, rational,
     e, irrational, f, real, g, imaginary, h, complex);
(%o6)                         done
(%i7) map (numberp, [a, b, c, d, e, f, g, h]);
(%o7) [false, false, false, false, false, false, false, false]
@end example

@end deffn



@defvr {Variable opcional} numer

La variable @code{numer} hace algunas funciones matemáticas
con argumentos numéricos se evalúen como decimales de punto flotante.
También hace que las variables de una expresión a las cuales se les ha
asignado un número sean sustituidas por sus valores.
Además, activa la variable @code{float}.

Véase también @code{%enumer}.

Ejemplos:

@c ===beg===
@c [sqrt(2), sin(1), 1/(1+sqrt(3))];
@c [sqrt(2), sin(1), 1/(1+sqrt(3))],numer;
@c ===end===
@example
(%i1) [sqrt(2), sin(1), 1/(1+sqrt(3))];
                                               1
(%o1)                   [sqrt(2), sin(1), -----------]
                                          sqrt(3) + 1
(%i2) [sqrt(2), sin(1), 1/(1+sqrt(3))],numer;
(%o2) [1.414213562373095, .8414709848078965, .3660254037844387]
@end example
@end defvr



@defvr {Variable opcional} numer_pbranch
Valor por defecto: @code{false}

La variable opcional @code{numer_pbranch} controla la evaluación
numérica de las potencias de números enteros, racionales y
decimales negativos. Si @code{numer_pbranch} vale @code{true} y el
exponente es decimal o la variable opcional @code{numer} vale 
@code{true}, Maxima evalúa el resultado numérico utilizando la rama
principal. En caso contrario, se devuleve un resultado simplificado pero
no evaluado.

Ejemplos:

@c ===beg===
@c (-2)^0.75;
@c (-2)^0.75,numer_pbranch:true;
@c (-2)^(3/4);
@c (-2)^(3/4),numer;
@c (-2)^(3/4),numer,numer_pbranch:true;
@c ===end===
@example
(%i1) (-2)^0.75;
(%o1) (-2)^0.75

(%i2) (-2)^0.75,numer_pbranch:true;
(%o2) 1.189207115002721*%i-1.189207115002721

(%i3) (-2)^(3/4);
(%o3) (-1)^(3/4)*2^(3/4)

(%i4) (-2)^(3/4),numer;
(%o4) 1.681792830507429*(-1)^0.75

(%i5) (-2)^(3/4),numer,numer_pbranch:true;
(%o5) 1.189207115002721*%i-1.189207115002721
@end example

@end defvr


@deffn {Función} numerval (@var{x_1}, @var{expr_1}, ..., @var{var_n}, @var{expr_n})
Declara las variables @code{x_1}, ..., @var{x_n} asignándoles los valores numéricos @code{expr_1}, ..., @code{expr_n}.
El valor numérico se evalúa y sustituye a la variable en cualquier expresión en la que ésta aparezca si @code{numer} toma el valor @code{true}. Véase también @code{ev}.

Las expresiones @code{expr_1}, ..., @code{expr_n} pueden ser expresiones no necesariamente numéricas.
@end deffn



@deffn {Función} oddp (@var{expr})
Devuelve @code{true} si @var{expr} es un entero impar y @code{false} en caso contrario.
@end deffn



@defvr {Variable opcional} ratepsilon
Valor por defecto: 2.0e-8

La variable @code{ratepsilon} guarda la tolerancia utilizada en la conversión de números decimales en coma flotante a números racionales.

@c NEED EXAMPLES HERE
@end defvr




@deffn {Función} rationalize (@var{expr})
Convierte todos los números en coma flotante de doble precisión y grandes (big float) presentes en una expresión @var{expr} de Maxima a sus formas racionales exactas equivalentes. Si el usuario no está familiarizado con la representación binaria de números en coma flotante, le puede extrañar que @code{rationalize (0.1)} no sea igual que 1/10.  Este comportamiento no es único de Maxima, ya que el número 1/10 en su forma binaria es periódico y no exacto.

@c ===beg===
@c rationalize (0.5);
@c rationalize (0.1);
@c fpprec : 5$
@c rationalize (0.1b0);
@c fpprec : 20$
@c rationalize (0.1b0);
@c rationalize (sin (0.1*x + 5.6));
@c ===end===
@example
(%i1) rationalize (0.5);
                                1
(%o1)                           -
                                2
(%i2) rationalize (0.1);
                               1
(%o2)                          --
                               10
(%i3) fpprec : 5$
(%i4) rationalize (0.1b0);
                             209715
(%o4)                        -------
                             2097152
(%i5) fpprec : 20$
(%i6) rationalize (0.1b0);
                     236118324143482260685
(%o6)                ----------------------
                     2361183241434822606848
(%i7) rationalize (sin (0.1*x + 5.6));
                              x    28
(%o7)                     sin(-- + --)
                              10   5
@end example
@end deffn



@deffn {Función} ratnump (@var{expr})
Devuelve @code{true} si @var{expr} es un entero literal o una fracción de enteros literales, en caso contrario devuelve @code{false}.

@end deffn








@page
@node Cadenas de texto, Constantes, Números, Tipos de datos y estructuras
@section Cadenas de texto


@menu
* Introducción a las cadenas de texto::
* Funciones y variables para las cadenas de texto::
@end menu




@node Introducción a las cadenas de texto, Funciones y variables para las cadenas de texto, Cadenas de texto, Cadenas de texto
@subsection Introducción a las cadenas de texto




Las cadenas de caracteres deben ir acotadas por comillas dobles (@code{"})
al ser introducidas en Maxima, siendo luego mostradas con o sin ellas, 
dependiendo del valor de la variable global @code{stringdisp}.

Las cadenas pueden contener todo tipo de caracteres, incluyendo tabulaciones,
caracteres de nueva línea y de retorno.
La secuencia @code{\"} se reconoce literalmente como una comilla doble, al
tiempo que @code{\\} se interpreta como una barra invertida. Cuando la barra
invertida aparece al final de una línea, tanto la barra como el
final de línea (representado éste bien por el carácter de nueva 
línea o el de retorno) son ignorados, de forma que la cadena
continúa en el siguiente renglón. No se reconocen más combinaciones especiales
de la barra invertida con otros caracteres aparte de las comentadas; de modo
que si la barra invertida aparece antes de cualquier otro carácter distinto de
@code{"}, @code{\}, o de un final de línea, dicha barra será
ignorada.
No hay manera de representar los caracteres especiales
(tabulación, nueva línea o retorno) de otra
forma que no sea incluyéndolos literalmente en la cadena.

No existe en Maxima el tipo de variable carácter, debiéndose
representar un carácter simple como una cadena de un solo carácter.

El paquete adicional @code{stringproc} contiene muchas funciones que
permiten trabajar con cadenas.

Ejemplos:

@c ===beg===
@c s_1 : "This is a string.";
@c s_2 : "Embedded \"double quotes\" and backslash \\ characters.";
@c s_3 : "Embedded line termination
@c in this string.";
@c s_4 : "Ignore the \
@c line termination \
@c characters in \
@c this string.";
@c stringdisp : false;
@c s_1;
@c stringdisp : true;
@c s_1;
@c ===end===
@example
(%i1) s_1 : "This is a string.";
(%o1)               This is a string.
(%i2) s_2 : "Embedded \"double quotes\" and backslash \\ characters.";
(%o2) Embedded "double quotes" and backslash \ characters.
(%i3) s_3 : "Embedded line termination
in this string.";
(%o3) Embedded line termination
in this string.
(%i4) s_4 : "Ignore the \
line termination \
characters in \
this string.";
(%o4) Ignore the line termination characters in this string.
(%i5) stringdisp : false;
(%o5)                         false
(%i6) s_1;
(%o6)               This is a string.
(%i7) stringdisp : true;
(%o7)                         true
(%i8) s_1;
(%o8)              "This is a string."
@end example








@node Funciones y variables para las cadenas de texto, , Introducción a las cadenas de texto, Cadenas de texto
@subsection Funciones y variables para las cadenas de texto



@deffn {Función} concat (@var{arg_1}, @var{arg_2}, ...)
Concatena sus argumentos, que deben ser todos átomos.
El valor devuelto es un símbolo si el primer argumento es a su vez un símbolo, o una cadena en caso contrario.

La función @code{concat} evalúa sus argumentos.
El apátrofo  @code{'} evita la evaluación.

@example
(%i1) y: 7$
(%i2) z: 88$
(%i3) concat (y, z/2);
(%o3)                          744
(%i4) concat ('y, z/2);
(%o4)                          y44
@end example

A un símbolo construido por @code{concat} se le puede asignar un valor y ser utilizado posteriormente en expresiones.
La asignación con el operador @code{::} evalúa su expresión izquierda.

@example
(%i5) a: concat ('y, z/2);
(%o5)                          y44
(%i6) a:: 123;
(%o6)                          123
(%i7) y44;
(%o7)                          123
(%i8) b^a;
                               y44
(%o8)                         b
(%i9) %, numer;
                               123
(%o9)                         b
@end example

Nótese que aunque @code{concat (1, 2)} parezca un número, se trata de una cadena.

@example
(%i10) concat (1, 2) + 3;
(%o10)                       12 + 3
@end example

@end deffn



@deffn {Función} sconcat (@var{arg_1}, @var{arg_2}, ...)

Concatena sus argumentos para producir una cadena.
Al contrario que @code{concat}, sus argumentos @i{no} necesitan ser átomos.

El resultado es una cadena.

@example
(%i1) sconcat ("xx[", 3, "]:", expand ((x+y)^3));
(%o1)               xx[3]:y^3+3*x*y^2+3*x^2*y+x^3
@end example
@end deffn



@deffn {Función} string (@var{expr})
Convierte @code{expr} a la notación lineal de Maxima, tal como si fuese tecleada.

El valor que retorna la función @code{string} es una cadena, por lo que no puede ser utilizada en los cálculos.

@end deffn


@defvr {Variable opcional} stringdisp
Valor por defecto: @code{false}

Si @code{stringdisp} vale @code{true},
las cadenas alfanuméricas se muestran encerradas entre comillas dobles. En caso contrario, no se nuestran las comillas.

La variable @code{stringdisp} vale siempre @code{true} cuando se muestra la definición de una función.


Ejemplos:

@c ===beg===
@c stringdisp: false$
@c "This is an example string.";
@c foo () := 
@c       print ("This is a string in a function definition.");
@c stringdisp: true$
@c "This is an example string.";
@c ===end===
@example
(%i1) stringdisp: false$
(%i2) "This is an example string.";
(%o2)              This is an example string.
(%i3) foo () :=
      print ("This is a string in a function definition.");
(%o3) foo() := 
              print("This is a string in a function definition.")
(%i4) stringdisp: true$
(%i5) "This is an example string.";
(%o5)             "This is an example string."
@end example

@end defvr



