float und double

MinaM

Mitglied
Hallo Zusammen,

und ich habe gleichwieder eine Frage.
Betrachten wir mal folgende Code:
Code:
 	public static void main(String[] args) {
		
		float a=300.1f, b=400.1f, c= 200.1f,d=600.1f, e=10.0f, y;
		
		y= b+(a *b +e -c * d)* d+(a-c) /(e+e);
		
		System.out.println(y); // Ergebnis=409.7883
		
	
		
		double a1=300.1, b1=400.1, c1=200.1, d1=600.1, e1= 10.0, y1;
		
		y1= b1+(a1 *b1 +e1-c1 * d1)* d1+(a1-c1) /(e1+e1);
		
		System.out.println(y1); // Ergenis = 405.10000000873265
		
		
	}

Obwohl es sich im prinzip um die gleichen Zahlen handelt mit denen ich gerechnet
habe nur eben einmal mit float-Zahlen und einmal mit double.
Unterscheiden sich die Ergebnisse erheblich. Wie kommt dieser große Unterschied zustande?

grüße
MinaM
 
Hi,

es hängt auf jedenfall mit der sog." Mantisse " zusammen, also wie float und double im Speicher implementiert sind. Dir geht irgendwo unterwegs etwas verloren,daher die verschiedenen Ergebnisse.

Google mal nach Mantisse ..... mehr weiss ich nämlich auch nicht mehr ;-)

Krösi
 
Hallo!

...wers ganz genau haben möchte nimmt BigDecimal:
Code:
  		BigDecimal aa1,bb1,cc1,dd1,ee1, yy1; 
  		aa1 = BigDecimal.valueOf(a1);
  		bb1 = BigDecimal.valueOf(b1);
  		cc1 = BigDecimal.valueOf(c1);
  		dd1 = BigDecimal.valueOf(d1);
  		ee1 = BigDecimal.valueOf(e1);
  		
 		yy1 = aa1.multiply(bb1).add(ee1).subtract(cc1.multiply(dd1)).multiply(dd1).add(aa1.subtract(cc1).divide(ee1.add(ee1))).add(bb1);
  		
  		System.out.println(yy1);

Ergibt: 405.100


Gruß Tom
 
Wenn du das genau wissen möchtest solltest du Dir bei google oder wikipedia vielleicht eine genauere Beschreibung zu IEEE-754 suchen dann kommst du denke ich selbst auch auf eine gesunde Lösung.

Auf Grund der Tatsache, dass bei der Addition im IEEE-754 Format (so wie sie intern
im Rechner abläuft sobald man zwei Zahlen des primitiven Datentyps float oder double
versucht zu addieren/subtrahieren) die Exponenten angeglichen werden müssen, und somit
die Mantissen verschoben werden, entsteht ein Fehler bei der Berechnung. Dieser Fehler fällt
insbesondere dann ins Gewicht wenn man versucht sehr grosse und sehr kleine Zahlen zu
addieren/ subtrahieren.
 
Zurück