Hola , he visto un programa que calcula los decimales de pi hasta 32 millones y me pregunto como lo hace ya que la variable decimal solo coge creo que 90 binarios.
Mi pregunta: ¿Como puedo crear un tipo de variable que me deje tener todos los dígitos que me de la gana?
Perdón no ví que era del subforo de .NET , como había salido al lado del foro de Programación General pues... Bueno de todas maneras te dejo el post.Hombre ese programa tiene un límite , puedo suponer que utiliza la librería GMP(The GNU Multiple Precision Arithmetic Library), el límite es la memoria del ordenador , cuando se acaba mmm malo , pero la verdad no tengo ni idea de como lo hacen, te aseguro que he estado mirando el código y no entiendo ni papa. Y no lo hacían con cadenas de texto.Y con respecto a tu pregunta , estuve mirando mucho tiempo como hacerlo y decidí dejarlo , pues solo se me ocurría con texto , y la librería de antes hacía la operación de sumar 200 veces más rápido(sin exagerar , calculé la rapidez de cada una y ahí están las conclusiones) que la función que creé. Además estuve mirando si podía sumar varias secciones de memoria pero no veas... Es una cosa curiosa y me gustaría saber como funciona pero es muy complicado.
En teoría se como podría funcionar pero en la práctica nunca he probado, habría que hacer una clase que maneje el tipo BitArray y otra que interprete los valores usando la transformación de sistemas binario a sistema decimal pero usando String, todas las operaciones se deben hacer en binario ya que el sistema decimal tiene un limite para cada tipo de variable y debe expresarse igualmente en String. Podría hacer un ejemplo de suma y resta, que no me llevaría mucho tiempo, pero es cuestión de investigar como se hacen las operaciones en binario, como se lleva el binario a decimal, y como se pueden expresar los decimales, me están pasando varias ideas por la mente...
Lo bueno del sistema binario es que las operaciones básicas, como la suma, resta, multiplicación y división están limitadas a operaciones extremadamente sencillas, ya que no hay muchas posibilidades, las operaciones son siempre 0 con 0, 1 con 0, 0 con 1 y 1 con 1.
Este es un ejemplo de suma, el problema se presenta al tratar de representarlo como String, no se me ocurre algo práctico por ahora...
Module Module1
Public Class Number
Public Bits As BitArray
Public MaxBits As Integer
''' <summary>
''' Constructor de la clase Number
''' </summary>
''' <param name="N"></param>
''' <remarks>Representa el límite en Bits</remarks>
Public Sub New(ByVal N As Integer)
'Recordemos que la cantidad de valores que puede tomar una variable que'
'soporta N bits es 2^N, de modo que 2^Integer.MaxValue es incalculable,'
'al menos normalmente, así que el límite lo dará la memoria disponible.'
MaxBits = N
Bits = New BitArray(N, False)
End Sub
''' <summary>
''' Representa un arreglo de Bits como String
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Overrides Function ToString() As String
ToString = String.Empty
For Each x As Boolean In Bits
ToString += ValorAbsoluto(x).ToString
Next
End Function
''' <summary>
''' Para un True (-1) Devuelve (1). Para un False (0) Devuelve (0).
''' </summary>
''' <param name="value"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ValorAbsoluto(ByVal value As Boolean) As Byte
Return CByte(CInt(value) * (-1))
End Function
Public Shared Operator +(ByVal a As Number, ByVal b As Number) As Number
Dim c As New Number(Math.Max(a.MaxBits, b.MaxBits))
Dim aVA As Byte, bVa As Byte
For N As Integer = 0 To (Math.Min(a.MaxBits, b.MaxBits) - 1)
aVA = ValorAbsoluto(a.Bits(N))
bVa = ValorAbsoluto(b.Bits(N))
If (aVA + bVa) > 1 Then
If (N - 1) < 0 Then
Throw New OverflowException()
Else
c.Bits(N) = False
c.Bits(N - 1) = True
End If
Else
c.Bits(N) = aVA + bVa
End If
Next
Return c
End Operator
End Class
Sub Main()
'Números de 8 Bits (Byte)'
Dim a As New Number(8)
Dim b As New Number(8)
'Está será la suma de Bits que realizaremos'
' 0 0 0 1 0 0 0 0'
'+ 0 0 0 1 0 0 0 0'
'-----------------'
' 0 0 1 0 0 0 0 0'
'Le damos a 'a' y 'b' el valor 1 (True) en el Index 3'
a.Bits.Set(3, True)
b.Bits.Set(3, True)
Dim c As Number = a + b
Console.WriteLine(c)
Console.ReadKey()
End Sub
End Module
Bajo esta explicación hice el ejemplo http://es.wikipedia.org/wiki/Sistema_binario#Suma_de_n.C3.BAmeros_binarios