| 

.NET C# Java Javascript Exception

6
Malzeit zusammen!

Ich studiere zur Zeit (und hoffentlich bis zum Schluss) Medieninformatik und wir müssen ein Script schreiben. Es sollen ganz einfache Sollwerte mit Messwerte verglichen werden.
Ich dachte eigentlich das das funktionieren würde, jedoch komme ich dann an meine Grenze warum 4.9e-324 <= 0.25 TRUE ergibt?

Wenn ich als Sollwert 0 und als Messwert -4.9e-324 eintragen dann bekomme ich die Ausgabe das mein Messwert innerhalb der Toleranz liegt, was aber eigentlich nicht sein kann.

Kann mir mal einer auf die Sprünge helfen?

Hier mein Code:

if (measuredValue == nominalValue) {

//measured value and nominal value are exactly the same
System.out.println("Messwert entspricht exakt dem Sollwert");

} else {

//Calculate the sum
double valueSum = measuredValue - nominalValue;

//if there is a negative sum, then the sign should be changed
valueSum = (valueSum < 0) ? valueSum * -1 : valueSum;

if (valueSum <= 0.25) {

//Value is less than or equal 0.25
System.out.println("Messwert liegt innerhalb der Toleranz");

} else if (valueSum <= 0.5) {

//Value is between 0.25 and 0.5
System.out.println("Messwert ist brauchbar");

} else {

//Value is over 0.5
System.out.println("Messwert ist Ausschuss");

}

}
28.10.2011
spiike 170 1 7
spiike 170 1 7
7 Antworten
2
Egal ob -4.9e-324, oder 4.9e-324: Das ist eine sehr sehr kleine Zahl. Erst die 324 Zahl nach dem Komma ist eine 4. e steht hier für Exponent und nicht für Euler. Deshalb ist es auch kleiner als 0.25
28.10.2011
LutzJ 1,3k 1 8
2
Unfug entfernt ;)
28.10.2011
puls200 3,8k 7
+1 für dein Edit :D
Mario Priebe 29.10.2011
2
Kann mir mal einer auf die Sprünge helfen?

Zur Interpretation der Exponentialschreibweise habe ich den bereits gegebenen Antworten nichts hinzuzufügen - aber wenn wir schon mal dabei sind: measuredValue und nominalValue sind anscheinend double-Variablen, die Du am Anfang auf Gleichheit prüfst. Das ist im allgemeinen keine gute Idee, weil zwei Gleitkommazahlen, die theoretisch/mathematisch den gleichen Wert darstellen sollten, in der Praxis nicht unbedingt gleich sein sind. Siehe dazu z.B. Wikipedia: Prüfung von Gleitkommazahlen auf Gleichheit. In Deinem Code sieht es für mich so aus, also ob Du Dir das äußerste "if" sparen könntest. Besser als "Differenz liegt innerhalb der Toleranz" kannst Du mit Gleitkommazahlen nicht werden, die Aussage "Messwert entspricht exakt dem Sollwert" hat hier keine Aussagekraft, weil Du eben Gleitkommazahlen nicht zuverlässig exakt auf Gleichheit prüfen kannst.
28.10.2011
Matthias Hlawatsch 13,2k 4 9
Wow, Danke. Das hätte ich jetzt nicht gedacht.

Ich denke aber, das das nicht sooo relatant ist für meine Aufgabe. Aber ich werde es im Hinterkopf behalten...
spiike 28.10.2011
Hm, und wie kann ich das nun in meiner Programmierung berücksichtigen?
spiike 28.10.2011
1
Siehe die Antwort von Eiger, der schneller als ich dazugekommen ist, das zu erläutern. Übrigens freuen sich die allermeisten Antwortenden hier auch über ein Dankeschön in Form von Bewertungen ;-)

Falls Du tatsächlich zwischen "ist innerhalb der 0,5-Toleranz" und "ist (quasi) gleich" unterscheiden mußt, wählst Du Dir eine sehr niedrige Toleranzschwelle (z.B. 1e-10, mußt Du anhand des fachlichen Kontextes entscheiden), innerhalb derer Du zwei Werte als gleich betrachten willst, und ergänzt einen entsprechenden if-Zweig.
Matthias Hlawatsch 28.10.2011
1
Wieso soll das nicht stimmen?
10 hoch - 324 ist eine sehr sehr kleine Zahl. Wenn du das dann mit e multiplizierst dann kommst du sicher auf ein Ergebnis unter 0.25

Deshalb sagt er dir auch dass der Messwert gültig ist
28.10.2011
michlG 1,7k 1 5
1
Also erstmal reicht der code wie folgt (wie Matthias sagte, aber du hast ja nochmal konkret nach der Umsetzung gefragt):

//Calculate the sum    
double valueSum = Math.Abs(measuredValue - nominalValue);

if (valueSum <= 0.25) {

//Value is less than or equal 0.25
System.out.println("Messwert liegt innerhalb der Toleranz");

} else if (valueSum <= 0.5) {

//Value is between 0.25 and 0.5
System.out.println("Messwert ist brauchbar");

} else {

//Value is over 0.5
System.out.println("Messwert ist Ausschuss");

}

Das heisst also, äussere if-Schleife weg und ausserdem kannst dir die signum-Abfrage einfacher machen mit einem Betrag!
Und hier noch was zum Lesen: Mathematik
28.10.2011
Eiger 1,9k 2 9
Eiger 1,9k 2 9
0
Wie sieht dann die Rechnung für die Summe aus?

10^-324 * 4,9 ?
28.10.2011
spiike 170 1 7
1
das ist genauso klein.
Denn das 10^-324 ist eine winzige Zahl. Da ist dann im Prinzip wurst mit was du es multiplizierst ;)
michlG 28.10.2011
0
Dann mal vielen Dank! Ich dachte wir sprechen hier von 4,... und nicht von Hochzahlen..

Kurze andere Frage, woher wisst ihr das es hoch irgendwas ist? Was ist das Merkmal dafür?
28.10.2011
spiike 170 1 7
10^x => nach der 10 steht das ^ und das ist das Zeichen für 10 hoch x
michlG 28.10.2011
Das merkmal ist das 'e'. 4.9e-324 steht für 4.9 mal (10 hoch -324).
Im übrigen wäre es gut, wenn Du die Antworten-Funktion nicht für weitere Fragen benutzen würdest. Das ist hier kein Dikussionsforum, bei dem ein Posting auf das nächste folgt. Wenn Du Rückfragen hast, kannst Du die Kommentarfunktion nutzen, Deine Frage editieren oder ggf. auch eine komplett neue Frage starten.
Matthias Hlawatsch 28.10.2011
okay, danke für den Tip!
spiike 28.10.2011

Stelle deine Java-Frage jetzt!