Fehler beim Berechnen von kubischer Funktion
Jakob
- javascript
Hallo,
das Skript das ich geschrieben hab berechnet die Funktion die in dem einen Kommentar steht. Gibt man nun für die Schrittweite im Formular 0.5,1,2 o.ä. ein gibt es kein Problem. Bei 0.1,0.2 und ähnliches gibt es aber seh krumme Zahlen für das x das eigentlich nur die Anfangszahl plus die Schrittweite jeweils sein sollte.
Wäre toll wenn jemand was rausfindet
Danke
Jakob
Hier das Skript: http://jakobmuecher.de/upload/AufgabeC.htm
Der Quellcode:
function kubfkt() {
// f(x) = ax^3+bx^2+cx+d
var a = document.form.a.value;
var b = document.form.b.value;
var c = document.form.c.value;
var d = document.form.d.value;
var schrittweite = document.form.schrittweite.value;
var ergebnis = "";
for (var x = parseFloat(document.form.min.value); x <= parseFloat(document.form.max.value); x = (x + parseFloat(schrittweite))) {
ergebnis = (parseFloat(a)*(Math.pow(x,3))) + (parseFloat(b)*(Math.pow(x,2))) + (parseFloat(c)*x) + parseFloat(d);
ergebnis *= 1000;
y = Math.round(ergebnis);
y /= 1000;
document.write ("<strong>" + x + "</strong>" + ": " + y + "<br>");
}
document.write ("<br>");
document.write ("<strong>Funktion: </strong>" + a + "x^3+" + b + "x^2+" + c + "x" + "+" + d);
}
Hallo Jakob,
das Skript das ich geschrieben hab berechnet die Funktion die in dem einen Kommentar steht. Gibt man nun für die Schrittweite im Formular 0.5,1,2 o.ä. ein gibt es kein Problem. Bei 0.1,0.2 und ähnliches gibt es aber seh krumme Zahlen für das x das eigentlich nur die Anfangszahl plus die Schrittweite jeweils sein sollte.
Ist Dir klar, dass die Gleitpunktzahlen
0.5
1
2
exakt dargestellt werden können, solch scheinbar einfache wie
0.1
0.2
jedoch nicht?
Ich hatte hier schon einmal folgenden Link http://pronix.linuxdelta.de/C/standard_C/c_programmierung_8.shtml#6 gepostet. Da sind Grundlagen der Gleitpunktzahlen erklärt, ein Abschnitt weiter eine nette Endlosschleife. Dass sich der verlinkte Artikel auf die Programmiersprache C bezieht, tut der Gültigkeit für Gleitpunktzahlen in anderen Programmiersprachen keinen Abbruch.
// f(x) = ax^3+bx^2+cx+d
Bei Verwendung von Potenzen können die Rundungsfehler aufgrund
der Ungenauigkeit der Darstellung halt schon mal größer werden.
Freundliche Grüsse,
Vinzenz
你好 Jakob,
das Skript das ich geschrieben hab berechnet die Funktion die in dem
einen Kommentar steht. Gibt man nun für die Schrittweite im Formular
0.5,1,2 o.ä. ein gibt es kein Problem.
Alles Werte, die man im Binaer-System problemlos darstellen kann: 0.1, 1,
10.
Bei 0.1,0.2 und ähnliches gibt es aber seh krumme Zahlen für das x [...]
Schonmal versucht, 0.1 oder 0.2 im Binaer-System darzustellen? ;-) Das gibt
keine endliche Zahl, sondern es wird zu einem periodischen Dezimalbruch. 0.1
ergibt 0,0 Periode 0011 und 0.2 gibt 0, Periode 0011. Die krummen Zahlen
kriegst du also wohl einfach aufgrund von Rundungsfehlern. Du koenntest
versuchen, Integerarithmethik zu benutzen und dann am Schluss zu dividieren,
um den Rundungsfehler klein zu halten.
再见,
CK