Jakob: Fehler beim Berechnen von kubischer Funktion

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);

}

  1. 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

  2. 你好 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

    --
    Willst du die Freuden dieser Welt geniessen, so musst du auch ihr Leid erdulden.
    http://wwwtech.de/