lunes, 19 de mayo de 2014

Receta No. 2-16 en C#: Manipulación de Valores Enteros Grandes

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código Fuente en C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En esta receta vamos a aprender acerca de la manipulación de valores enteros grandes. Esto representa una oportunidad para obtener conocimiento y técnica, útil para aquellas aplicaciones científicas o financieras (por poner un ejemplo) que deben realizar cómputos sobre valores que van más allá del soporte común en aplicaciones rutinarias. Esto nos obliga a echar un vistazo a varios de los artefactos del Framework .NET que posibilitan este tipo tareas. ¡Veamos!

1. Problema

Una entidad bancaria llamada Bancamiga ha solicitado a nuestra compañía de construcción de software -Ad Infinitum Systems-, la construcción de un módulo de cómputo que requiere la manipulación de cuentas con un largo historial de registros que incluyen valores de operaciones por encima de los soportados actualmente por el módulo legado.

2. Solución

El arquitecto de software apenas recibió el requerimiento del módulo a desarrollo, comprendió enseguida que uno de los artefactos fundamentales que provee el Framework .NET es la estructura System.Numerics.BigInteger. Esta estructura supera los límites de los tipos de datos por valor integrados (e.g., Int32 [2], Int64 [3]; -2^31 hasta 2^31-1, y, -2^63 hasta 2^32-1, respectivamente).

3. Discusión de la Solución

En artículos previos tuvimos -Tipos Numéricos en C#- la oportunidad de conocer acerca de los tipos numéricos en C#:
Tipos numéricos predefinidos en C#.
Figura 1. Tipos numéricos predefinidos en C# [5].
El entero de mayor capacidad que vemos en la Figura 1 es long. Rango:
  • Límite inferior: -2^63 = -9223372036854775808
  • Límite superior: 2^63-1 = 9223372036854775807
Nuestros cálculos diarios no sobrepasan estos valores enteros. Sin embargo, en muchas organizaciones esto sí que representa un límite de capacidad de almacenamiento de valores numéricos.

En vista de lo anterior, el Framework .NET posee la estructura System.Numerics.BigInteger [6]. Esta estructura supera estos límites permitiendo la manipulación en memoria de valores enteros arbitrarios (según los requerimientos de cómputo, por ejemplo).

Constructores disponibles de BigInteger con los que podemos crear un valor entero a partir, por ejemplo, de un arreglo de bytes, los enteros estándar:
Constructores de la estructura BigInteger
Figura 2. Constructores de la estructura BigInteger [6].
[Nota: Recomiendo ver el listado completo de los métodos de BigInteger que permiten al programador realizar comparaciones, igualdades, desplazamiento de bits a la izquierda y a la derecha, negación unaria, aritmética básica, entre muchas más.]

A continuación un par de ejemplos de uso de esta estructura:

3.1 Instanciación

BigInteger bigIntDesdeDouble = new BigIntger(311572.1415796);
BigInteger bigIntDesdeInt64 = new BigInteger(9223372036854775707);

Console.WriteLine(bigIntDesdeDouble); // Salida: 311572.1415796
Console.WriteLine(bigIntDesdeInt64); // Salida: 9223372036854775707

3.2 Creación a partir de arreglo de bytes

byte[] arregloBytes = {10, 9, 8, 7,6, 5, 4, 3, 2, 1, 0};

BigInteger bi = new BigInteger(arregloBytes);
Console.WriteLine("El valor de `bi` es {0}.", bi);

3.3 Creacion a partir de cadenas de caracteres


Prueba de compilación, ejecución, y salida:
Creación de instancias de BigInteger a partir de objetos string
Figura 3. Creación de instancias de BigInteger a partir de objetos string.

4. Práctica: Código Fuente C#

Varios programadores han empezado a crear ejemplos. Uno de ellos ha realizado el siguiente código fuente C# para demostrar el uso de BigInteger:


Compilación:


  1. csc /target:exe /reference:System.Numerics.dll DemoBigInteger.cs

Resultado:
Instanciación de la clase BigInteger.
Figura 4. Instanciación de la clase BigInteger.

Conclusiones

Interesante receta en donde hemos aprendido a crear valor enteros grandes. La clase BigInteger (namespace System.Numerics) es la solución que provee el Framework .NET para sortear la manipulación de cadenas de valores numéricos extensas. Esto nos puede resultar útil, por ejemplo, para aplicaciones financieras, o científicas.

Glosario

  • BigInteger
  • Entero
  • Instanciación
  • Límite
  • Valor

Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Int32 (Estructura) (System) - http://msdn.microsoft.com/es-es/library/system.int32(v=vs.110).aspx
[3]: Int64 (Estructura) (System) - http://msdn.microsoft.com/es-es/library/system.int64(v=vs.110).aspx
[4]: Tipos Numéricos en C# - http://ortizol.blogspot.com/2013/07/tipos-numericos-en-c-parte-1.html
[5]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[6]: BigInteger (Structure) (System.Numerics) - http://msdn.microsoft.com/es-es/library/system.numerics.biginteger(v=vs.110).aspx


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.