elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Double, long, decimal... la siguiente
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Double, long, decimal... la siguiente  (Leído 2,334 veces)
juanlulete

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Double, long, decimal... la siguiente
« en: 12 Agosto 2012, 19:22 pm »

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?


En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Double, long, decimal... la siguiente
« Respuesta #1 en: 12 Agosto 2012, 19:44 pm »

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.



« Última modificación: 12 Agosto 2012, 20:16 pm por avesudra » En línea

Regístrate en
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Double, long, decimal... la siguiente
« Respuesta #2 en: 13 Agosto 2012, 21:34 pm »

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
  1. Module Module1
  2.  
  3.    Public Class Number
  4.  
  5.        Public Bits As BitArray
  6.        Public MaxBits As Integer
  7.  
  8.        ''' <summary>
  9.        ''' Constructor de la clase Number
  10.        ''' </summary>
  11.        ''' <param name="N"></param>
  12.        ''' <remarks>Representa el límite en Bits</remarks>
  13.        Public Sub New(ByVal N As Integer)
  14.  
  15.            'Recordemos que la cantidad de valores que puede tomar una variable que'
  16.            'soporta N bits es 2^N, de modo que 2^Integer.MaxValue es incalculable,'
  17.            'al menos normalmente, así que el límite lo dará la memoria disponible.'
  18.  
  19.            MaxBits = N
  20.            Bits = New BitArray(N, False)
  21.  
  22.        End Sub
  23.  
  24.        ''' <summary>
  25.        ''' Representa un arreglo de Bits como String
  26.        ''' </summary>
  27.        ''' <returns></returns>
  28.        ''' <remarks></remarks>
  29.        Public Overrides Function ToString() As String
  30.  
  31.            ToString = String.Empty
  32.  
  33.            For Each x As Boolean In Bits
  34.                ToString += ValorAbsoluto(x).ToString
  35.            Next
  36.  
  37.        End Function
  38.  
  39.        ''' <summary>
  40.        ''' Para un True (-1) Devuelve (1). Para un False (0) Devuelve (0).
  41.        ''' </summary>
  42.        ''' <param name="value"></param>
  43.        ''' <returns></returns>
  44.        ''' <remarks></remarks>
  45.        Public Shared Function ValorAbsoluto(ByVal value As Boolean) As Byte
  46.            Return CByte(CInt(value) * (-1))
  47.        End Function
  48.  
  49.        Public Shared Operator +(ByVal a As Number, ByVal b As Number) As Number
  50.  
  51.            Dim c As New Number(Math.Max(a.MaxBits, b.MaxBits))
  52.  
  53.            Dim aVA As Byte, bVa As Byte
  54.  
  55.            For N As Integer = 0 To (Math.Min(a.MaxBits, b.MaxBits) - 1)
  56.  
  57.                aVA = ValorAbsoluto(a.Bits(N))
  58.                bVa = ValorAbsoluto(b.Bits(N))
  59.  
  60.                If (aVA + bVa) > 1 Then
  61.                    If (N - 1) < 0 Then
  62.                        Throw New OverflowException()
  63.                    Else
  64.                        c.Bits(N) = False
  65.                        c.Bits(N - 1) = True
  66.                    End If
  67.                Else
  68.                    c.Bits(N) = aVA + bVa
  69.                End If
  70.  
  71.            Next
  72.  
  73.            Return c
  74.  
  75.        End Operator
  76.  
  77.    End Class
  78.  
  79.    Sub Main()
  80.  
  81.        'Números de 8 Bits (Byte)'
  82.        Dim a As New Number(8)
  83.        Dim b As New Number(8)
  84.  
  85.        'Está será la suma de Bits que realizaremos'
  86.  
  87.        '  0 0 0 1 0 0 0 0'
  88.        '+ 0 0 0 1 0 0 0 0'
  89.        '-----------------'
  90.        '  0 0 1 0 0 0 0 0'
  91.  
  92.        'Le damos a 'a' y 'b' el valor 1 (True) en el Index 3'
  93.        a.Bits.Set(3, True)
  94.        b.Bits.Set(3, True)
  95.  
  96.        Dim c As Number = a + b
  97.  
  98.        Console.WriteLine(c)
  99.  
  100.        Console.ReadKey()
  101.  
  102.    End Sub
  103.  
  104. End Module

Bajo esta explicación hice el ejemplo http://es.wikipedia.org/wiki/Sistema_binario#Suma_de_n.C3.BAmeros_binarios
« Última modificación: 14 Agosto 2012, 02:09 am por Keyen Night » En línea

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...
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines