Representación de un número

Iniciado por maikmilk, 5 Junio 2012, 17:04 PM

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

maikmilk

El problema es el siguiente para representar en java un número en java muy grande el numero se representa de la siguiente forma "2.305843009213694E18" o sea el número elevado a algo

Hay forma de representar el número tal cual??

Yo e encontrado lo siguiente:

Código (java) [Seleccionar]
import java.util.*;
import java.text.*;
import java.io.*;

public class prueba
{
    public static void main(String args[])
    {
        DecimalFormat decimal = new DecimalFormat("");
       
        double op = (Math.pow(2,61))-1;
        System.out.println(op);
        System.out.println(decimal.format(op));
    }
}


"DecimalFormat decimal = new DecimalFormat("")"

Pero el número que sale por pantalla es el siguiente:

Código (java) [Seleccionar]
2.305843009213694E18
2.305.843.009.213.694.000


O sea el número 2.305.843.009.213.694.000 cuando realmente 2^61 es 2305843009213693951, por que se pierde tanta precisión?

lluvplay

hola amigo!!! creo que tu solucion es usar el tipo de dato BigDecimal de la libreria Math
yo he probado con tu código y la transformación y pues listo me a funcionado.
Espero haber podido ayudar !!!! saludos.

public class Prueva {

    public static void main(String[] args)
{
        double op = (Math.pow(2,61));
        BigDecimal opp= new BigDecimal(op);
        System.out.println(opp);
   }
}

listo probado en mi calculadora y en mi pc !!!
Anexo un ultimo datito BigDecimal de ta precicion!!!
::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::)
* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !

maikmilk

Perfecto!!!

Mi ultima duda es posible ahora almacenar esa variable opp en un double o en un long?

Porque a la hora de usarla en condicionales un BigDecimal no lo puedo usar ya que da un error "incomparable types: java.math.BigDecimal and int".

Todo esto sin perder precisión.

lluvplay

Puedes ser un poco mas especifico con lo que se quiere condicionar ?

ejemplo si queremos condicionar

double respuesta=math.pow(2,61);

if (respuesta ==2.305843009213694E18)
/// sentencias si es cierto
else
// sentencias si es falso

condicionalo asi q es igual !!!
solo sinecesitas mostrar resultados as la tranformacion a BigDecimal.

ejemplo
BigDecimal respuesta_de_bigdecimal= new BigDecimal(respuesta);
System.out.print(respuesta_de_bigdecimal);

pero si tienes q hacer bajo codigo he operaciones algebraicas y condiciones mi recomendacion es q lo trates con double y conviertas al final lo q es salida !!!

he intentado convertir el valor pero me devuelve valores con letras !!! asiq ps noc si estoy aclarando la duda pero hay vamos cualquiera cosa comentemos y listo !!!

Saludos....  ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::)

* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !

maikmilk

esta noche te he enseño todo el código y el problema en concreto

maikmilk

Código (java) [Seleccionar]
import java.util.*;
import java.io.*;
import java.math.*;
/**
* Calculo de la secuencia de Mersenne [(2^n)-1] y comprobación de si el número
* es primo o no.
* Salida por pantalla y guardada en .txt indicando si el numero obtenido es primo y la secuencia de Mersenne
*/
public class Mersenne
{
    public static void primosMersenne(double n)
    {
        Calendar tiempo = Calendar.getInstance();
        File f = new File("/Users/Miki/Desktop/Datos.txt");
        try
        {
            PrintWriter pw = new PrintWriter(new FileOutputStream(f,true));
            pw.println("Calculo de la secuencia de Mersenne y de sus números primos");
            pw.println("-----------------------------------------------------------");
            for(int i = 2; i <= n; i++)
            {
                double op = (Math.pow(2,i)-1);
                BigDecimal uno = new BigDecimal(op);
                BigDecimal dos = new BigDecimal(1);
                BigDecimal res = uno.subtract(dos);
                System.out.println(res);
                pw.println(res);
                boolean primo = true;
                if(op == 2)
                {
                    primo = true;
                }
                else
                {
                    if(op%2 == 0)
                    {
                        primo = false;
                    }
                    else
                    {
                        int x = 3;
                        int raiz =(int)Math.sqrt(op);
                        while(x <= raiz && op%x != 0)
                        {
                            x += 2;
                        }
                       
                        if(x > raiz)
                        {
                            primo = true;
                        }
                        else
                        {
                            primo = false;
                        }
                    }
                }
                if(primo == true)
                {
                    System.out.println(i+"==> El número "+res+" es primo de la secuencia de Mersenne "+tiempo.get(Calendar.HOUR)+":"+tiempo.get(Calendar.MINUTE)+":"+tiempo.get(Calendar.SECOND)+":"+tiempo.get(Calendar.MILLISECOND));
                    pw.println(i+"==> El número "+res+" es primo de la secuencia de Mersenne "+tiempo.get(Calendar.HOUR)+":"+tiempo.get(Calendar.MINUTE)+":"+tiempo.get(Calendar.SECOND)+":"+tiempo.get(Calendar.MILLISECOND));
                }
        }
        pw.close();
        }
        catch(FileNotFoundException e)
        {
            System.err.println("Problemas al abrir el fichero. "+e);
        }
    }
}


Como veras cuando calculo si el numero es primo o no utilizo condicionales "if(op == 2)", y si utilizo op en vez de opp(BigDecimal) el numero no es realmente el número que toca y el programa falla.
Es decir el numero 2^61 en double seria: 2.305843009213694E18 lo que realmente es 2305843009213693951 el cual es un número primo pero si entra como double no interpreta el número que realmente es y no lo toma como primo.
Por eso cuando se hace "if(op == 2)" necesito que op sea 2305843009213693951 y no 2.305843009213694E18.

Un poco lio no jajajjaa, esto no corre prisa ni es para nada es todo autodidacta y para aprender, si puedes o crees que se puede mejorar el código me encantaria discutirlo.
Gracias

lluvplay

He provado usando el op como double y no importa si estoy trabajando con 2.305843009213694E18  igual me debuelve que su residuo es 0 !!!

solo una observacion que en el for se manifiesta un i=2 incializado.
si vemos el op= math.pow(2,i); eso seria minimo 4 entonces no comprendo el

if(op==2)

jejeje no se si me doy ha entender o estoy comprendiendo mal la secuencia de mersenne.
* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !