Contruindo uma varivel do tipo Float32!

Ola mais uma vez. Procurei sobre Float32 aqui no forum e nao encontrei nada… Eu tenho que transformar um numero dado pelo usuario (String -> Float32), converter para binario, dividir de 8 em 8 e tranformar cada grupo de 8 bits em hexa

De momento estou usando o seguinte codigo

Float fl = new Float(vOholdoff.getText()) ; @SuppressWarnings("static-access") String outt = fl.toString(16); System.out.println(outt); tedArea.append(BinStringToHex(outt.substring(0, 8))); //Printing in hex the frist 8 bits tedArea.append(BinStringToHex(outt.substring(8, 16))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(16, 24))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(24, 32))); //Printing in hex next 8 Bits

Nao eh eficiente mas funciona. O problema que eh uma float comum, sendo assim ele da erro na hora que procura os ultimos bits
Na minha cabeca (que esta errada claro), era so usar Float32 no lugar do Float… Mass… Nao funciona

Em Java o tipo de dados float… tem 32 bits

E o double tem 64 bits…

Esses são os tipos de dados disponíveis em ponto flutuante

E tem a classe BigDecimal… para números gigantescos…

[quote=rogelgarcia]Em Java o tipo de dados float… tem 32 bits

E o double tem 64 bits…

Esses são os tipos de dados disponíveis em ponto flutuante

E tem a classe BigDecimal… para números gigantescos…

[/quote]

Mas entao na teoria era para funcinar

Porem ele imprime 30 bits quando eu uso virgula, teria que ser 32 certo?
100000010100000000000000000000
Por isso ele nao consegue formar o ultimo hexa

Na verdade do codigo correto eh este

Float bi = new Float(vOholdoff.getText()) ; @SuppressWarnings("static-access") String outt = Integer.toBinaryString(Float.floatToRawIntBits(bi)); //String outt = bi.toString(16); System.out.println(outt); tedArea.append(BinStringToHex(outt.substring(0, 8))); //Printing in hex the frist 8 bits tedArea.append(BinStringToHex(outt.substring(8, 16))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(16, 24))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(24, 31))); //Printing in hex next 8 Bits

ELe imprime
111111000000000000000000000000
111111000001011111001010001000
111111000001011111001010001110

Somente 30?

Talvez… os dois primeiros bits são 00?? E por isso nao tá imprimindo??

Isso… acredito que seja isso, bem pensado… Ateh pq calculando vi que ele esta retornando o numero errado em hexa

Entao sabes como fazer ele mostrar todos os 32 bits? Pois nesse caso (em todo binario acredito) sao mt importantes tais zeros a esquerda…

Obrigado!

Veja se isto funciona.

class TesteFloat {
    public static void main (String[] args) {
        float[] dados = {
            1.0f,
            0.5f,
            65536.0f,
            0.0000152587890625f,
            (float) Math.sqrt (2.0),
            (float) Math.PI
        };

        for (float f : dados) {
            int x = Float.floatToIntBits (f);

            System.out.printf ("%f -> %08X %n", f, x);
        }            
    }
}

Essas informacoes podem ajudar

Especificação da Linguagem Java - Floating Points Types, Formats And Values
http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3

IEEE 754 (Padrão usado para pontos flutuantes em Java)

Como sera sempre um numero positivo… resolvi do modo bruto… colei os dois 00 na frente do bin

tedArea.append("0a 04 "); Float bi = new Float(vOholdoff.getText()) ; @SuppressWarnings("static-access") String outt = Integer.toBinaryString(Float.floatToRawIntBits(bi)); //String outt = bi.toString(16); System.out.println(outt); tedArea.append(BinStringToHex("00" + outt.substring(0, 6))); //Printing in hex the frist 8 bits tedArea.append(BinStringToHex(outt.substring(6, 14))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(14, 22))); //Printing in hex next 8 Bits tedArea.append(BinStringToHex(outt.substring(22, 30))); //Printing in hex next 8 Bits tedArea.append("\n");

Obrigado a todos mais uma vez

isso
tedArea.append(BinStringToHex(“00” + outt.substring(0, 6))); //Printing in hex the frist 8 bits
tedArea.append(BinStringToHex(outt.substring(6, 14))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(14, 22))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(22, 30))); //Printing in hex next 8 Bits

nao seria
tedArea.append(BinStringToHex(outt.substring(0, 8 ))); //Printing in hex the frist 8 bits
tedArea.append(BinStringToHex(outt.substring(8, 16))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(16, 24))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(24, 32))); //Printing in hex next 8 Bits

?

[quote=rogelgarcia]Essas informacoes podem ajudar

Especificação da Linguagem Java - Floating Points Types, Formats And Values
http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3

IEEE 754 (Padrão usado para pontos flutuantes em Java)


[/quote]

Obrigado… Usei a 754 para resolver o problema… No meu caso vai funcinar… Mas dependendo o caso (se for um numero negtivo por exemplo) teri q mudar o codigo…

[quote=rogelgarcia]isso
tedArea.append(BinStringToHex(“00” + outt.substring(0, 6))); //Printing in hex the frist 8 bits
tedArea.append(BinStringToHex(outt.substring(6, 14))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(14, 22))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(22, 30))); //Printing in hex next 8 Bits

nao seria
tedArea.append(BinStringToHex(outt.substring(0, 8 ))); //Printing in hex the frist 8 bits
tedArea.append(BinStringToHex(outt.substring(8, 16))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(16, 24))); //Printing in hex next 8 Bits
tedArea.append(BinStringToHex(outt.substring(24, 32))); //Printing in hex next 8 Bits

?[/quote]

Nao nesse caso, como ele so estava imprimindo 30 bits (excluia os 2 primeiros) eu recoloquei os dois zeros na frente nesta linha
tedArea.append(BinStringToHex(“00” + outt.substring(0, 6))); //Printing in hex the frist 8 bits
Sendo assim ele nao vai ter que pegar os 8 primeiros bits… somente o 00 (que inclui manualmente) e os 6 primeiros… finalizando 8 bits
dai em diante ele vai pegando os outros de 8 em 8
6 + 8 = 14 (pega bit 6 ateh o 14)

e assim por diante… fechando os 30 bits + 2 bits que botei no inicio… = 32