Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 KB | None | 0 0
  1. public class StringToFloat
  2. {
  3. public static void main(String[] args)
  4. {
  5. if(args.length != 1 || (args[0].length() != 32) || !args[0].matches("[01]{32}")) //reihenfolge wichtig, weil args[0] nicht zwingend existieren muss - java überprüft nicht weiter, wenn die 1. Bedingung true ergibt. matches("[01]{32}") überprüft, ob args[0] aus 32 mal [1 oder 0] besteht
  6. {
  7. System.out.println("usage: javac StringToFloat x\n - x has the format: 1 bit for Negation, 8 bit for the Exponent and 23 bit mantisse");
  8. System.exit(1);
  9. }
  10. String str = args[0];
  11.  
  12. System.out.println(str.substring(0,1)+"|"+str.substring(1,9)+"|"+str.substring(9)); //Zeigt an, wo der String aufgetrennt wird
  13.  
  14. int e = bin2int(str.substring(1,9)); //extrahiert den Exponenten; substring gibt ab Stelle 1 bis 9 zurück
  15. int m;
  16. if(e==0) {
  17. m = bin2int(str.substring(9)); //Denormalisiert
  18. } else {
  19. m = bin2int("1" + str.substring(9)); //Normalisiert
  20. }
  21. int s = (str.charAt(0)=='1') ? -1 : 1; //steht am Anfang eine 0 so wird die Zahl negativ
  22.  
  23. System.out.printf("%1s|%8s|%23s\n", (s==1 ? '+' : '-'), e, m); //gibt die Werte für s, e, m aus
  24.  
  25. float f = (float)Math.pow(2,e-127) * m * (float)Math.pow(2,-23); //(float) braucht man, weil Math.pow double zurückgibt und man ihn zwingen muss zur not zu runden - Vorzeichen kommt noch
  26.  
  27. if(e==0 && m==0) { //Exponent nur Nullen und Mantisse leer
  28. System.out.println((s==1 ? "+0" : "-0"));
  29. } else if(e==255) { //Exponent nur Einsen
  30. if (!str.substring(9).contains("1")) { //Mantisse nur Nullen
  31. System.out.println((s==1 ? "POSITIVE_INFINITY" : "NEGATIVE_INFINITY")); //Unendlichkeiten
  32. } else {
  33. System.out.println("NaN"); //Not a Number - hab wir nicht definiert
  34. }
  35. } else {
  36. System.out.println("Ohne Vorzeichen: " + f);
  37. System.out.println("Mit Vorzeichen: " + s * f);
  38. }
  39.  
  40.  
  41. }
  42. public static int bin2int(String in) //wandelt einen String aus 1 und 0 in eine Integer
  43. {
  44. int result=0, exp=0;
  45. for(int i=in.length()-1; i>=0; i--) //zählt von der letzten zur ersten Stelle herrunter
  46. {
  47. result += (in.charAt(i)=='1') ? Math.pow(2,exp) : 0; //die entsprechende 2er-Potenz wird aufaddiert wenn die aktuelle Stelle =1 ist
  48. exp++;
  49. }
  50. return result;
  51. }
  52.  
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement