Ver Mensaje Individual
  #4 (permalink)  
Antiguo 13/11/2018, 13:32
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Lista de números binarios c#

Si el valor de pot supera al de un entero, por mucho que incrementes i nunca alcanzarás el valor de pot, ya que, cuando i llegue al entero máximo, en el próximo incremento empieza a tomar valores negativos, con lo que nunca se cumple la condición de salida del bucle.

Te pongo un ejemplo para enteros de 16 bits. Tendríamos un rango de -32768 a +32767. Si yo introduzco una longitud de 18, Math.Pow(2,18) = 262144, y mi bucle tendría que ir de 0 a 262143. Pero, al alcanzar i el valor de 32767, en el siguiente incremento la combinación de bits resultante corresponderá a un valor de i = -32768, con lo que el bucle sigue incrementando i hasta volver a llegar a +32767, y vuelta a empezar. Es decir, mi problema aparecería con longitudes superiores a 15.

Resumiendo, tal como has hecho el programa, el límite te lo da el tamaño en bits de un entero.

¿Solución? Si tienes enteros de 64 bits (no sé si C# dispone de este tipo de enteros), el problema te aparecerá con longitudes superiores a 63. Otra solución sería el empleo de librerías de precisión arbitraria, buscando en internet encontrarás unas cuantas, aunque no sé si las hay para C#.

Saludos,