Double, long, decimal... la siguiente

Iniciado por juanlulete, 12 Agosto 2012, 19:22 PM

0 Miembros y 1 Visitante están viendo este tema.

juanlulete

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?

avesudra

#1
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.

Regístrate en

Keyen Night

#2
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...
Código (vb.net) [Seleccionar]

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
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...