2015-11-01 1 views
0

J'essaye de convertir un nombre de valeur décimale à son formulaire IEEE 752. Par exemple:Convertir décimal en binaire IEEE

+43.9542 -> 01000010001011111101000100011010 
-43.9542 -> 11000010001011111101000100011010 

Et je l'ai écrit cette méthode:

public float GetFloat32(String numero) { 

     //Convert 
     int intBits = Integer.parseInt(numero, 2); 
     float myFloat = Float.intBitsToFloat(intBits); 

     //Exponent 
     getExponent = 127 + (String.valueOf(Integer.toBinaryString(Math.abs((int) myFloat))).length() - 1); 

     //Sign 
     getSign = (myFloat < 0) ? 1 : 0; 

     return myFloat; 
    } 

Il y a un problème que je ne peux pas résoudre. Je vais faire un autre exemple pour le rendre clair.

double a = k.GetFloat32("01000010001011111101000100011010") 
a = 43.9542 

Mais lorsque le nombre est négatif, comme

double a = k.GetFloat32("1000010001011111101000100011010") 

Je reçois cette erreur:

Error message

Cela signifie que mon code fonctionne parfaitement avec des chiffres positifs (y compris le zéro) mais avec des nombres négatifs, il se bloque. Où est le problème?

Remarque

Je pensais que je pouvais résoudre mon problème de cette façon

  1. Vérifiez si String numero a une charAt (0) égale à 1
  2. Si oui (numero.charAt (0) == 1) puis supprimez le premier caractère
  3. Appelez GetFloat32() avec le nouveau numéro (sans le 1)
  4. Retour le résultat addin g le - devant le num

Cela pourrait fonctionner mais j'aimerais savoir où est le problème dans la méthode ci-dessus. Je préférerais éviter cette solution si possible.

+0

Y at-il une raison d'avoir les affectations '' getExponent' et getSign' dans la méthode? – Clashsoft

+0

Connaissez-vous 'Float.intBitsToFloat'? –

+0

Alberto, est-ce que 752 est une faute de frappe et voulez-vous dire 752 - l'étiquette est ieee-754. Dans ce cas, la suggestion de Paul est applicable. Je n'ai pas trouvé IEEE 752, donc je ne l'ai pas proposé. – laune

Répondre

3

Le problème est que int/Integer a une limite supérieure de 0x7FFF_FFFF et donc la méthode Integer.parseInt ne dépassera pas cette limite. Utiliser Long.parseLong, vérifier la valeur résultante pour dépasser 0x7FFF_FFFFL et gérer selon la logique requise pour les valeurs entières négatives.

Cependant, je ne vois rien de mal dans votre propre idée de dépouiller le bit de signe et de traiter avec le reste pour obtenir la valeur absolue.

Édition Il n'y a pas moyen d'obtenir le flottant codé avec une conversion entière simple à partir d'une chaîne de bits. Considérez simplement que +1 et -1 dans 32 chiffres binaires selon la représentation du complément à deux diffèrent dans plus d'un bit, et 100 .... 000 n'est pas -0. La magnitude signée n'est pas la même que celle du complément à deux. De plus, les littéraux binaires et hexadécimaux de Java (ou de toute autre base) sont censés être des quantités positives; Si vous avez besoin d'une valeur négative, utilisez un signe.

plus tard Méthode Integer.parseUnsignedInt ne dispose pas d'un avantage sur l'utilisation à long, puisque vous aurez alors de savoir comment utiliser l'arithmétique de complément à deux pour enlever le premier (signe) bits pour produire la valeur absolue qui peut alors être divisé en exposant et mantisse. (Ajoutez ou soustrayez Integer.MIN_VALUE.)

S'il n'y a pas IEEE 752 et IEEE 754 est le format cible, la forme la plus simple est

float f1 = Float.intBitsToFloat(Integer.parseUnsignedInt(numerio,2)); 
+0

Maintenant c'est taquet merci! Je vais utiliser la solution que je pensais avec la chose charAt (0) :) –

+1

N'utiliserait pas simplement '(int) Long.parseLong (...)' suffice? En outre, les littéraux entiers dans toutes les radix, pas seulement hexadécimal et binaire, sont censés être positifs. Le '-' ne fait pas partie du littéral. – RealSkeptic

+1

@RealSkeptic Sommes-nous sur différentes longueurs d'onde? Le Long.parseLong est dans ma réponse, et j'ai essayé d'exprimer votre "Aussi ... littéral" dans la dernière phrase, édité il y a 8 minutes. – laune

-1
import java.util.*; 

public class IEEE754 { 

    public static void main(String[] args) { 

     float floa; 

     Scanner sc = new Scanner(System.in); 

     System.out.println("ENTER A FLOATING POINT NUMBER"); 

     floa=sc.nextFloat(); 

     int no,sign; 

     no=(int) floa; 

     String a= Integer.toBinaryString(no); 

     String sub=a.substring(1, a.length()); 

     if(floa<0) 

     { 

      sign=1; 

     } 

     else 

     { 

      sign=0; 

     } 

     int exp=a.length()-1; 

     System.out.println(exp); 

     int be=127+exp; 

     String b= Integer.toBinaryString(be); 

     System.out.print("biased exponent->"); 

     System.out.println(b); 

     int loop=23-exp; 

     float floatpart =floa-no; 

     int q[]=new int[25]; 

     for(int i=1,j=0;i<=loop;i++,j++) 

     { 

      q[j]=(int) (floatpart*2); 

      floatpart=floatpart*2; 

      if(q[j]==1){ 

       floatpart=floatpart-1; 

      } 

     } 

     System.out.print("mantissa->"); 

     System.out.print(sub); 

     for(int k=0;k<q.length;k++) 

     System.out.print(q[k]); 

      System.out.println(); 

         System.out.println("IEEE754 FORMAT IS"); 

         System.out.print(sign+" "+b+" "); 

         System.out.print(sub); 

     for(int k=0;k<q.length;k++) 

     System.out.print(q[k]); 

    } 

}