Biblioteca C Math

De Wikihaskell
Saltar a: navegación, buscar

CMath es una biblioteca usada comúnmente en los lenguajes de programación C y C++. que gracias a Don Stewart, ha sido adaptada para el lenguaje Haskell.

CMath contiene una gran cantidad de funciones matemáticas que nos harán mucho más sencilla la programación, ahorrándonos el tener que implementar las funciones cada vez que vayamos a usarlas. Destaca el número de funciones que hacen uso de números en coma flotante. Entre otras, esta biblioteca incluye funciones trigonométricas, exponenciales, logarítmicas, de redondeo...


Funciones matemáticas
Ampliación de funciones matemáticas predefinadas
Lenguaje Haskell
Biblioteca C Math
Autores Jose A. Dorado Cerón
Gonzalo Saavedra Postigo

Contenido

Cómo descargar la biblioteca

Se puede descargar de manera libre de la página oficial de Haskell.

En la URL: [1] podemos encontrar el paquete "cmath-0.3.tar.gz" empaquetado mediante Cabal

El paquete incluye todo lo necesario para su instalación, así como una guía para el uso de la biblioteca.


Cómo instalar la biblioteca

Lo primero que debemos de instalar es tanto la biblioteca Cabal como el intérprete de Cabal dado que nuestra biblioteca CMath se encuentra empaquetada bajo este formato. Mostramos los pasos a seguir para llevar a cabo la instalación según el sistema operativo. Para una mayor información en caso de obtener problemas o alguna duda véase la biblioteca Cabal


Primero instalar Cabal

1- Instalamos una serie de dependencias necesarias: sudo apt-get install ghc6 libghc6-parsec-dev libghc6-network-dev libghc6-http-dev libghc6-mtl-dev zlib1g-dev, debiendo mostrar las actualizaciones que correspondan según el caso:

verduritas@verduritas:~$ sudo apt-get install ghc6 libghc6-parsec-dev libghc6-network-dev libghc6-http-dev libghc6-mtl-dev zlib1g-dev
[sudo] password for verduritas: 
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
ghc6 ya está en su versión más reciente.
Nota, seleccionando libghc6-parsec2-dev en lugar de libghc6-parsec-dev
libghc6-parsec2-dev ya está en su versión más reciente.
libghc6-network-dev ya está en su versión más reciente.
libghc6-http-dev ya está en su versión más reciente.
libghc6-mtl-dev ya está en su versión más reciente.
fijado libghc6-mtl-dev como instalado manualmente.
zlib1g-dev ya está en su versión más reciente.
Se instalaron de forma automática los siguientes paquetes y ya no son necesarios.
  libopenal1 linux-headers-2.6.31-14 libalut0 linux-headers-2.6.31-14-generic
Utilice «apt-get autoremove» para eliminarlos.
0 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados.


2- Descargamos el intérprete de [2], lo descomprimimos, nos situamos dentro de la carpeta descomprimida y ejecutamos:

./bootstrap.sh

El resultado de ejecutar la instrucción anterior deberá producir un resultado similar a este:

verduritas@verduritas:~$ cd cabal-install-0.6.2/
verduritas@verduritas:~/cabal-install-0.6.2$ ./bootstrap.sh 
Checking installed packages for ghc-6.10.4...
parsec is already installed and the version is ok.
network is already installed and the version is ok.
Cabal is already installed and the version is ok.
HTTP is already installed and the version is ok.
zlib is already installed and the version is ok.
cleaning...
Linking Setup ...
Configuring cabal-install-0.6.2...
Preprocessing executables for cabal-install-0.6.2...
Building cabal-install-0.6.2...
[ 1 of 33] Compiling Distribution.Client.Check ( Distribution/Client/Check.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Check.o )
[ 2 of 33] Compiling Distribution.Client.BuildReports.Types ( Distribution/Client/BuildReports/Types.hs, dist/build/cabal/cabal-tmp/Distribution/Client/BuildReports/Types.o )
[ 3 of 33] Compiling Distribution.Client.Types ( Distribution/Client/Types.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Types.o )
[ 4 of 33] Compiling Distribution.Client.Dependency.TopDown.Types ( Distribution/Client/Dependency/TopDown/Types.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Dependency/TopDown/Types.o )
[ 5 of 33] Compiling Distribution.Client.Setup ( Distribution/Client/Setup.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Setup.o )
[ 6 of 33] Compiling Distribution.Client.Config ( Distribution/Client/Config.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Config.o )
[ 7 of 33] Compiling Distribution.Client.Win32SelfUpgrade ( Distribution/Client/Win32SelfUpgrade.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Win32SelfUpgrade.o )
[ 8 of 33] Compiling Paths_cabal_install ( dist/build/autogen/Paths_cabal_install.hs, dist/build/cabal/cabal-tmp/Paths_cabal_install.o )
[ 9 of 33] Compiling Distribution.Client.HttpUtils ( Distribution/Client/HttpUtils.hs, dist/build/cabal/cabal-tmp/Distribution/Client/HttpUtils.o )
[10 of 33] Compiling Distribution.Compat.TempFile ( Distribution/Compat/TempFile.hs, dist/build/cabal/cabal-tmp/Distribution/Compat/TempFile.o )
[11 of 33] Compiling Distribution.Client.Utils ( Distribution/Client/Utils.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Utils.o )
[12 of 33] Compiling Distribution.Client.Tar ( Distribution/Client/Tar.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Tar.o )
[13 of 33] Compiling Distribution.Client.IndexUtils ( Distribution/Client/IndexUtils.hs, dist/build/cabal/cabal-tmp/Distribution/Client/IndexUtils.o )
[14 of 33] Compiling Distribution.Client.InstallPlan ( Distribution/Client/InstallPlan.hs, dist/build/cabal/cabal-tmp/Distribution/Client/InstallPlan.o )
[15 of 33] Compiling Distribution.Client.Dependency.Types ( Distribution/Client/Dependency/Types.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Dependency/Types.o )
[16 of 33] Compiling Distribution.Client.Dependency.Bogus ( Distribution/Client/Dependency/Bogus.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Dependency/Bogus.o )
[17 of 33] Compiling Distribution.Client.InstallSymlink ( Distribution/Client/InstallSymlink.hs, dist/build/cabal/cabal-tmp/Distribution/Client/InstallSymlink.o )
[18 of 33] Compiling Distribution.Client.Dependency.TopDown.Constraints ( Distribution/Client/Dependency/TopDown/Constraints.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Dependency/TopDown/Constraints.o )
[19 of 33] Compiling Distribution.Client.Dependency.TopDown ( Distribution/Client/Dependency/TopDown.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Dependency/TopDown.o )

Distribution/Client/Dependency/TopDown.hs:37:55:
    Warning: Imported from `Distribution.Package' but not used:
               `notThisPackageVersion'

Distribution/Client/Dependency/TopDown.hs:555:0:
    Warning: Defined but not used: `addPackageExcludeConstraint'
[20 of 33] Compiling Distribution.Client.Dependency ( Distribution/Client/Dependency.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Dependency.o )
[21 of 33] Compiling Distribution.Client.Fetch ( Distribution/Client/Fetch.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Fetch.o )
[22 of 33] Compiling Distribution.Client.Unpack ( Distribution/Client/Unpack.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Unpack.o )
[23 of 33] Compiling Distribution.Client.SrcDist ( Distribution/Client/SrcDist.hs, dist/build/cabal/cabal-tmp/Distribution/Client/SrcDist.o )
[24 of 33] Compiling Distribution.Client.BuildReports.Anonymous ( Distribution/Client/BuildReports/Anonymous.hs, dist/build/cabal/cabal-tmp/Distribution/Client/BuildReports/Anonymous.o )
[25 of 33] Compiling Distribution.Client.BuildReports.Upload ( Distribution/Client/BuildReports/Upload.hs, dist/build/cabal/cabal-tmp/Distribution/Client/BuildReports/Upload.o )

Distribution/Client/BuildReports/Upload.hs:63:6:
    Warning: Defined but not used: `response'
[26 of 33] Compiling Distribution.Client.Upload ( Distribution/Client/Upload.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Upload.o )
[27 of 33] Compiling Distribution.Client.BuildReports.Storage ( Distribution/Client/BuildReports/Storage.hs, dist/build/cabal/cabal-tmp/Distribution/Client/BuildReports/Storage.o )
[28 of 33] Compiling Distribution.Client.Update ( Distribution/Client/Update.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Update.o )
[29 of 33] Compiling Distribution.Client.SetupWrapper ( Distribution/Client/SetupWrapper.hs, dist/build/cabal/cabal-tmp/Distribution/Client/SetupWrapper.o )
[30 of 33] Compiling Distribution.Client.Configure ( Distribution/Client/Configure.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Configure.o )
[31 of 33] Compiling Distribution.Client.Install ( Distribution/Client/Install.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Install.o )
[32 of 33] Compiling Distribution.Client.List ( Distribution/Client/List.hs, dist/build/cabal/cabal-tmp/Distribution/Client/List.o )
[33 of 33] Compiling Main             ( Main.hs, dist/build/cabal/cabal-tmp/Main.o )
Linking dist/build/cabal/cabal ...
Installing executable(s) in /home/verduritas/.cabal/bin


3- A continuación añadimos la ruta de cabal al $PATH ejecutando:

sudo ~/.bashrc ~/.bashrc-backup
sudo gedit ~/.bashrc&

Añadimos al final del fichero:

PATH=$PATH:~/.cabal/bin
export PATH

Guardamos el documento y cerramos el fichero. Reiniciamos la sesión Escribimos

echo $PATH

y comprobamos que aparezca

~/.cabal/bin

4- Si todo ha ido bien, solo tenemos que actualizar

cabal update

5- A continuación instalamos el paquete Cabal, para ello descargamos [3], descomprimimos el fichero y al igual que antes nos situamos dentro de la carpeta descomprimida y ejecutamos:

ghc --make Setup
./Setup configure --user
./Setup build
./Setup install

En el caso de ser administradores en vez de ejecutar lo anterior ejecutamos

ghc --make Setup
./Setup configure
./Setup build
sudo ./Setup install

Instalar Biblioteca CMath

1- Bien, si habeis seguido correctamente los pasos anteriores ya tendreis instalada correctamente la biblioteca de empaquetamiento cabal, así que continuamos a detallar los pasos a seguir para instalar la biblioteca CMath. Para ello, lo primero que debemos hacer es descargarnos la biblioteca de [4].

2- Ejecutamos la siguiente orden, y si el paquete tiene alguna dependencia cabal se las descargará y las intalará:

cabal install cmath

El resultado debe ser algo similar a:

verduritas@verduritas:~/cmath$ cabal install
Resolving dependencies...
Configuring cmath-0.3...
Preprocessing library cmath-0.3...
Building cmath-0.3...
/usr/bin/ar: creating dist/build/libHScmath-0.3.a
Installing library in /home/verduritas/.cabal/lib/cmath-0.3/ghc-6.10.4
Registering cmath-0.3...
Reading package info from "dist/installed-pkg-config" ... done.
Writing new package config file... done.
verduritas@verduritas:~/cmath$ 


Cómo comprobar si la instalación es correcta

Normalmente esta biblioteca suele venir instalada por defecto, tanto en los compiladores hugs o ghc, pero tanto para los que ya la tienen instalada como para los que acaban de instalarla manual o a través de la Biblioteca de empaquetamiento Cabal pueden comprobarlo ejecutando alguna función específica de la biblioteca (de las que hablaremos mas adelante).

Bien, en función de qué compilador estén usando lo realizarán de una manera determinada:

  • Si utiliza el compilador hugs introduzca en el prelude lo siguiente:
verduritas@verduritas:~$ hugs
__   __ __  __  ____   ___      _________________________________________
||   || ||  || ||  || ||__      Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__||  __||     Copyright (c) 1994-2005
||---||         ___||           World Wide Web: http://haskell.org/hugs
||   ||                         Bugs: http://hackage.haskell.org/trac/hugs
||   || Version: September 2006 _________________________________________

Haskell 98 mode: Restart with command line option -98 to enable extensions

Type :? for help
Hugs> atan 34
1.54139303859089
Hugs> 

  • Si por otro lado estas utilizando el compilador ghc coloque en el prelude lo siguiente:
verduritas@verduritas:~$ ghc
ghc             ghci            ghc-pkg         
ghc6            ghci6           ghc-pkg6        
ghc-6.10.4      ghci-6.10.4     ghc-pkg-6.10.4  
verduritas@verduritas:~$ ghci
GHCi, version 6.10.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> atan 34
1.5413930385908916
Prelude> 


Documentación

A continuación se muestra las funciones principales de las que consta esta biblioteca junto con una pequeña introducción en función a su uso:

  • La función acos y asin calcula los valores principales del arco coseno de x en el intervalo [0, pi] y del arco seno de x en el intervalo [-pi2, + pi2] respectivamente.
- acos :: Double -> Double 
- asin :: Double -> Double


  • La función atan calcula el valor principal del arco tangente de x en el intervalo [-pi2, + pi2].
- atan:: Double -> Doble


  • La función 'atan2' calcula el valor principal de la arco tangente de Y / X, utilizando los signos de ambos argumentos para determinar el cuadrante del valor de retorno.
- atan2:: Double -> Double -> Double


  • La función cos y sin calculan el coseno de x (medido en radianes) y el seno de x (medido en radianes).
- cos:: Double -> Doble
- sin:: Double -> Doble


  • La función tan calcula la tangente de x (medido en radianes). Un argumento de gran magnitud puede dar un resultado con poca o ninguna importancia.
- Tan:: Double -> Doble


  • La función cosh, sinh y tanh calculan respectivamente el coseno hiperbólico, el seno hiperbólico y la tangente hiperbólica de x.
- cosh:: Double -> Doble
- sinh:: Double -> Doble
- tanh:: Double -> Doble


  • La función acosh, asinh y atanh calculan respectivamente el inverso del coseno hiperbólico, el seno hiperbólico y la tangente hiperbólica de x.
- acosh:: Double -> Doble
- asinh:: Double -> Doble
- atanh:: Double -> Doble


  • La función exp () calcula el valor exponencial de los argumentos dados x.
- exp:: Double -> Doble 


  • frexp convierte números de punto flotante en componentes fraccionales e integrales.
- frexp:: Doble -> (double, int) 


  • La función de ldexp multiplica un número de punto flotante por una potencia entera de 2. ldexp no se define en el informe del 98 de Haskell.
- ldexp:: Double -> Int -> Doble 


  • La función log () calcula el valor del logaritmo natural del argumento x mientras que log10 calcula el valor del argumento x logaritmo de base 10.
- Log:: Double -> Doble 
- log10:: Double -> Doble 


  • La función modf rompe el valor del argumento en parte integral y fraccional, cada uno de los cuales tiene el mismo signo como argumento. modf no se define en el informe del 98 de Haskell.
- modf:: Doble -> (Double, Double) 


  • La función pow calcula el valor de x en el exponente y.
- Pow:: Double -> Double -> Double 


  • La función sqrt calcula la raíz cuadrada no negativa de x.
- sqrt:: Double -> Doble 


  • La función cbrt calcula la raíz cúbica no negativa de x.
- cbrt:: Double -> Doble 


  • La función fabs calcula el valor absoluto de un número de punto flotante de x.
- fabs:: Double -> Doble 


  • La función ceil retorna el valor más pequeño integrante mayor o igual que x mientras que floor el valor más grande del integral inferior o igual a x. La función Round devuelve el valor del integral más cercano de x, si x se encuentra a medio camino entre dos valores enteros, estas funciones devuelven el valor integral con el mayor valor absoluto (es decir, redondea hacia cero).
- ceil:: Double -> Doble 
- floor:: Double -> Doble 
- round:: Double -> Doble 


  • La función de fmod calcula el residuo de punto flotante de x / y.
- fmod:: Double -> Double -> Double


  • La función de trunc calcula el residuo de punto flotante de x / y.
- trunc:: Double -> Doble 


  • El fer calcula la función de error de x. La función de error se define como:
  erf (x) = 2/sqrt (pi) * integral desde 0 a x de exp (-t * t dt).
- fer:: Double -> Doble 


  • La función de erfc calcula la función de error complementario de x, es decir erfc () resta el resultado de la función de error, erf (x) de 1,0.
- erfc:: Double -> Doble 


- Gamma:: Double -> Doble 


  • La función de hypot calcula la función sqrt (x * x + y * y) si no existe underflow, y el desbordamiento se produce sólo si el resultado final merece.
- hypot:: Double -> Double -> Double


  • La función isinf devuelve 1 el número es infinito y 0 si no lo es.
- isinf:: Double -> Int


  • La función isnan devuelve 1 si el número no es un número y 0 en otro caso.
- isnan:: Double -> Int 
  • La función finite devuelve 1 cuando - infinito < x < infinito; devuelve 0 si |x| es infinito o no es un número.
- finite:: Double -> Int 


  • Las funciones j0 y j1' calcula la función de Bessel de primer tipo de orden 0 y de orden 1 respectivamente.
- j0:: Double -> Double 
- j1:: Double -> Double


  • Las funciones y0, y1' y yn calcula la función de Bessel de segundo tipo de orden 0, de orden 1 y de orden n respectivamente para el valor positivo x.
- y0:: Double -> Double 
- y1:: Double -> Double
- yn:: Double -> Double


  • La función lgamma devuelve ln |(x)|.
- lgamma:: Double -> Double


  • La función logb devuelve el exponente n de x, un entero con signo convertido a punto flotante de doble precisión.
- logb:: Double -> Double 


  • La función nextafter devuelve el siguiente número representable desde x en dirección y.
- nextafter:: Double -> Double -> Double


  • La función remainder devuelve el resto = x - n * y; El resto de (x,0) y (infinito,0) son operaciones inválidas que no producen un número.
- nextafter:: Double -> Double -> Double


  • La función scalb de x y n devuelve x * ( 2 ** n) con manipulación de exponente.
- scalb:: Double -> Double 


  • La función significand devuelve "sig", donde x = sig * 2 ** n; teniendo en cuenta que 1 <= sig < 2. La función no está definida cuando x es 0, +-infinito o no es un número.
- significand:: Double -> Double 


  • La función copysign de x e y devuelve x con el signo cambiado con y.
- significand:: Double -> Double -> Double


  • La función ilogb devuelve el exponente n de x en formato integer.
- scalb:: Double -> Int


  • La función rint devuelve el valor representado como un número en coma flotante de doble presición más cercano a x en modo redondeo.
- rint:: Double -> Double


Ejemplos

A continuación vamos a mostrar un ejemplo de uso de cada una de las funciones matemáticas de la biblioteca C Math.

  • Función arco coseno
- Hugs> acos 0.5
- 1.0471975511966
  • Función arco seno
- Hugs> asin 0.5
- 0.523598775598299
  • Función arco tangente
- Hugs> atan 1.5
- 0.982793723247329
  • Función arco tangente 2
- Hugs> atan2 3 4
- 0.643501108793284
  • Función coseno
- Hugs> cos 30
- 0.154251449887584
  • Función seno
- Hugs> sin 0.54
- 0.514135991653113
  • Función tangente
- Hugs> tan 0.85
- 1.13833271322844
  • Función coseno hiperbólico
- Hugs> cosh 2
- 3.76219569108363
  • Función seno hiperbólico
- Hugs> sinh 2
- 3.62686040784702
  • Función tangente hiperbólico
- Hugs> tanh 1.5
- 0.905148253644866
  • Función inverso coseno hiperbólico
- Hugs> acosh 3
- 1.76274717403909
  • Función inverso seno hiperbólico
- Hugs> asinh 3
- 1.81844645923207
  • Función inverso tangente hiperbólico
- Hugs> atanh 0.2
- 0.202732554054082
  • Función exponencial
- Hugs> exp 1
- 2.71828182845905
  • Función logaritmo
- Hugs> log 1
- 0.0
  • Función potencia
- Hugs> pow 2 3
- 8
  • Función valor absoluto
- Hugs> fabs -4.3
- 4.3
  • Función raiz cuadrada
- sqrt 35
- 5.91607978309962
  • Función raiz cúbica
- cbrt 35
- 3.27106631
  • Función redondeo igual o inferior
- Hugs> floor 5.8
- 5
  • Función redondeo igual o inferior
- Hugs> round 4.51
- 5
  • Función infinito
- Hugs> isinf 23
- 0
  • Función es un número
- Hugs> isnan 2
- 0
  • Función finito
- Hugs> finite 26
- 1
  • Función significand
- Hugs> significand 4
- 0.5
  • Función copia de signo
- Hugs> copysign 4 -7
- -4


Bibliografía

Herramientas personales