for-schleife funktioniert nicht
horachorus
- javascript
0 Timo "God's Boss" Reitz0 Linksetzer2 LX0 horachorus0 LX
Hallo Leute!
Als Übung habe ich diese Anwendung geschrieben:
<script type="text/javascript">
function mab() {
var i
for (i = 0; i <= 100; i += 0.1) {
var a = 1;
var b = i;
var mab;
if (a <= (1/b) && a <= (1/a + b)) {
var mab = a;
}
else if (1/b <= a && 1/b <= (1/a + b)) {
var mab = 1/b;
}
else if ((1/a + b) <= a && (1/a + b) <= 1/b) {
var mab = (1/a + b);
};
document.write("m(a,b) ist " + Math.round(mab * 1000)/1000 + " wenn b "+ i + " ist und a 1
ist.<br />");
};
}
mab();
</script>
so, nur leider funktioniert das nicht ganz so wie ich es mir vorgestellt habe.
eigentlich müsste das doch so aussehen?
m(a,b) ist 1 wenn b 0.1 ist und a 1 ist.
m(a,b) ist ... wenn b 0.2 ist und a 1 ist.
m(a,b) ist ... wenn b 0.3 ist und a 1 ist.
m(a,b) ist ... wenn b 0.4 ist und a 1 ist.
m(a,b) ist ... wenn b 0.5 ist und a 1 ist.
m(a,b) ist ... wenn b 0.6 ist und a 1 ist.
m(a,b) ist ... wenn b 0.7 ist und a 1 ist.
usw...
nur leider wird es so angezeigt:
m(a,b) ist 1 wenn b 0.1 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.2 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.30000000000000004 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.4 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.5 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.6 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.7 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.7999999999999999 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.8999999999999999 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.9999999999999999 ist und a 1 ist.
m(a,b) ist 0.909 wenn b 1.0999999999999999 ist und a 1 ist.
m(a,b) ist 0.833 wenn b 1.2 ist und a 1 ist.
m(a,b) ist 0.769 wenn b 1.3 ist und a 1 ist.
m(a,b) ist 0.714 wenn b 1.4000000000000001 ist und a 1 ist.
m(a,b) ist 0.667 wenn b 1.5000000000000002 ist und a 1 ist.
m(a,b) ist 0.625 wenn b 1.6000000000000003 ist und a 1 ist.
m(a,b) ist 0.588 wenn b 1.7000000000000004 ist und a 1 ist.
m(a,b) ist 0.556 wenn b 1.8000000000000005 ist und a 1 ist.
m(a,b) ist 0.526 wenn b 1.9000000000000006 ist und a 1 ist.
warum das?
wäre froh um eventuelle antworten
danke schon mal im voraus!
Das Problem ist nicht die for-Schleife, sondern das Rechnen mit Zahlen, die keine Ganzzahlen sind (Zahlen in JavaScript sind immer 64-Bit-IEEE-754-Zahlen). Hier kommt es mitunter zu Ungenauigkeiten, da rationale Zahlen, deren Nenner keine Potenz von 2 ist, in diesem Format nicht verlustlos dargestellt werden können.
Das Problem ist nicht die for-Schleife, sondern das Rechnen mit Zahlen, die keine Ganzzahlen sind (Zahlen in JavaScript sind immer 64-Bit-IEEE-754-Zahlen). Hier kommt es mitunter zu Ungenauigkeiten, da rationale Zahlen, deren Nenner keine Potenz von 2 ist, in diesem Format nicht verlustlos dargestellt werden können.
Danke für die Antwort, aber muss man das jetzt kapieren? :) (ich hoffe das kommt jetzt nicht zu frech rüber)
Trotzdem ein herzliches Dankeschön
m(a,b) ist 1 wenn b 0.1 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.2 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.30000000000000004 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.4 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.5 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.6 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.7 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.7999999999999999 ist und a 1 ist.
m(a,b) ist 1 wenn b 0.8999999999999999 ist und a 1 ist.
http://forum.de.selfhtml.org/hilfe/faq.htm#fliesskommarechnung
Danke, genau das was ich wissen wollte :)
Hallo!
Schade, dass Du unseren Rat offenbar immer noch nicht komplett beherzigt hast, aber diesmal sieht die Funktion fast so aus, als könnte sie sogar einen Zweck erfüllen, auch wenn sich dieser beim Lesen nicht wirklich erschließt.
Allein zum Spaß habe ich sie mal analysiert. Gleich zu Anfang: Du deklarierst die Funktion mab, die Du in ihrem eigenen Block als Float-Variable überschreibst. Es funktioniert zwar, verknotet aber schnell die Gehirnwindungen. Wenn Du ein Ergebnis berechnen willst, nehme Variablennamen wie "result" oder "ergebnis".
Dann stelle ich fest, dass Du zu überflüssigen Zeilen neigst wie bspw. "var i[Semikolon fehlt] for (i = 0..." - an dieser Stelle macht es den Code eher weniger übersichtlich und bedeutet zusätzliche Möglichkeiten für Fehler wie etwa das vergessene Semikolon. Deine Schleife zählt von 0 bis 99.9 in 0.1er Schritten.
Als nächstes initialisierst Du die Integervariable a mit der Zahl 1. Im gesamten Code ändert sich diese Zahl nicht - schlimmer noch, Du teilst durch diese 1 an unzähligen Stellen - das Ergebnis bleibt immer 1 und wird sich nicht ändern. Immerhin hast Du an dieser Stelle die Semikolons nicht vergessen - Du machst Fortschritte!
Die Variable b wird in der Schleife auf i gesetzt, was die Frage aufwirft, warum Du nicht gleich i verwendest, da auch an b im Zuge der Abfragen nichts verändert wird. Nun die erste Bedingung: 1 <= 1/[0 - 99.9] && 1 <= (1 + [0 - 99.9] - diese Bedingung trifft bei b=0 zu und sonst nie. In diesem Fall ist das Ergebnis 1.
Schon nach dem ersten Schleifendurchlauf kommen wir zur zweiten Abfrage. Diese trifft bei allen Zahlen ab 1 zu. Das Ergebnis ist 1/i.
Damit kommen nur die Zahlen 0.1 - 0.9 überhaupt in die dritte Abfrage - und erfüllen deren Bedingung nicht, daher bekommst Du an dieser Stelle auch kein korrektes Ergebnis, denn mab ist innerhalb der Funktion bereits auf 1 gesetzt worden.
Jetzt schließt Du Abfragen und for-Schleife. Bitte verzichte auf die Semikolons nach den geschweiften Klammern - die sind an dieser Stelle nicht nur fehl am Platze, sondern sehen so aus wie gewollt und nicht gekonnt; ein Anblick, der die metaphorische Entsprechung von Fingernägeln, die über die Tafel der geschundenen Programmiererseele kratzen, darstellt.
Bitte, sei so nett und formatiere Deinen Code außerdem in Zukunft so, dass man ihn lesen kann, ohne die überflüssigen Leerzeilen und vielleicht mit dem einen oder anderen Kommentar, in dem steht, was Du Dir von dem darunterstehenden Befehl erhoffst. Das macht Dir und uns das Leben auf Dauer wesentlich einfacher und Du bekommst schneller Hilfe.
Gruß, LX
Vielen Dank LX,
Das du den Sinn dieser Anwendung erfragst kann ich verstehen. es ist zu einer Mathematikaufgabe, die lautet
Zu zwei positiven reellen Zahlen a und b sein m(a,b) die kleinste der drei zahlen a, 1/b und 1/a+b
die variable a wird sich natürlich auch noch ändern aber das kommt noch ;-)
mir ist vollkommen klar, dass ich damit nicht die Aufgabe lösen kann, aber eben wie gesagt als Art Übung
Nochmal bin ich dir natürlich sehr sehr dankbar für deine ausführliche Analyse, aber wäre es vielleicht möglich solche Bemerkungen wie
Immerhin hast Du an dieser Stelle die Semikolons nicht vergessen - Du machst Fortschritte!
weglassen, ich gebe ja zu dass ich ein Anfänger bin aber das gibt mir das Gefühl wie ein Kleinkind angesprochen zu werden
Ansonsten werde ich mir deine Ratschläge zu Herzen nehmen, also vielen dank nochmal
mfg horachorus
PS: Du hast alles beantwortet außer meine eigentliche frage ;-) Aber egal es sind ja ausreichend andere antworten hier :-)
Hallo, Horachorus!
Falls Du meine Bemerkung als Sarkasmus aufgefaßt haben solltest, so bitte ich um Entschuldigung - das war durchaus nicht meine Absicht - vielmehr wollte ich voller Stolz darauf hinweisen, dass die Qualität Deiner Scripte seit dem letzten Posting besser geworden ist.
Übrigens: Wenn Du die kleinste von 2 Zahlen haben willst, solltest Du http://de.selfhtml.org/javascript/objekte/math.htm#min@title=Math.min verwenden (kann man auch ineinander kapseln). Allerdings bleibt dabei immer noch das Problem der Fließkomma-Ungenauigkeit von JavaScript.
Der Einfachheit halber solltest Du daher auf eine andere Sprache wie bspw. Python oder Ruby ausweichen (Lua finde ich zwar auch gut, hat aber in dieser Hinsicht genau das gleiche Problem). Für rein mathematische Anwendungen bieten sich auch Haskell oder im Extremfall sogar Forth an.
Wenn Du trotzdem mit JavaScript weitermachen möchtest, noch eine Fleißaufgabe: schreibe optional statt des Ergebnisses ein div mit style="border: 1px solid red; height: 1px; width: [10*Ergebnis]px" auf die Seite, um eine grafische Repräsentation Deines Ergebnisses zu bekommen.
Gruß, LX