Fehler bei Gleitkommaberechnungen => Prozessorfehler
-
Als ich heute eine eigenen Funktion zur Wurzelberechnung, als Übung für Algorithmen (ich weiß es gibt sqrt() in math.h/cmath), geschrieben habe kam ich trotz richtigen Algorithmus (habe schön alle Werte immer mit cout/printf abgefangen und im Kopf nachgerechnet) auf Fehlerhafte Wurzeln.
Also habe ich auch alle Funktion, die diese Funktion benutzt auseinander genommen.
Unter anderen war dies die Funktion qd(), auch als Übung geschrieben.
//Nur das Wichtigste des Quelltextes!!! #include <stdio.h> float qd(float a) { a *= a; return a; } int main() { float a = 4.1; float b; b = qd(a); printf("Das Quadrat von %f ist %f\n", a, b); return 0; }Als ich diese einfache Funktion auf Herz und Nieren prüfte stellte ich fest, dass auf Eingaben wie zB: 4.1 der Wert 16,8099999 herauskamen.
Könnte ein Fehler im Prozessor (es war doch der Prozessor, wo die Werte berechnete oder jedenfalls ein teil, oder?) daran Schuld sein, sind es doch nur meine bisher mehr als bescheidenen Programmierkünste (nur zweieinhalb Wochen erfahrung).
\E: Seltsamerweise spukt der Windowstaschenrechner die richtigen werte aus.
\E:
Betriebsystem : Windows XP
Hardware : Wichtigstes
CPU Typ Intel Pentium 4, 2533 MHz (19 x 133)
CPU Bezeichnung Northwood, A80532
-
Da alle anderen Programme funktionieren ist eindeutig dein Rechner kaputt. Schau mal bei wikipedia oder sowas an wie gleitpunktzahlen funktionieren.
-
Du glaubst also das der Rechner hinüber ist, hab ich das richtig verstanden?
Warum funktioniert dann der Windowsrechner(Arbeitet er mit Tabellen wo es eingespeichert ist)?
-
Nein der holt sich die Ergebnisse direkt übers Internet vom Microsoft Hauptcomputer und nur dieser hat ausreichend Power für solche Rechnungen.
-
Hi,
float bietet nicht genügend Genauigkeit. Benutz daher double...
#include <stdio.h> double qd(double a) { return a * a; // So ist's kürzer ;-) } int main() { double a = 4.1; double b; b = qd(a); printf("Das Quadrat von %lf ist %lf\n", a, b); // %lf für double... return 0; }PS: Rück deinen Code mal vernünftig ein!
-
vielen dank ^^
wirklich mit double werten klappt es super.
aber trotzdem... float ist demnach eigentlich sogut wie unnütz, wenn es schon bei so einfachen rechnungen fehleranfällig ist? ich werds mir in zukunft merken immer wenns ganz genau sein soll double zu nutzen.
-
Du hast einfach den Sinn von Gleitkommazahlen nicht verstanden. Lies dir mal die entsprechenden Wikipediaartikel durch.
-
In Kürze:
1. Gleitkommazahlen haben eine feste Anzahl von gültigen Ziffern "vor" dem Exponenten.2. Gleitkommazahlen werden üblicherweise binär abgelegt, Dadurch werden aus einigen im dezimalen endlichen Zahlen periodische. z.b. 0.1(dec) = 0.000110011... (bin)
3. == für Gleitkommazahlen ist fast immer eine schlechte Idee
Und der Windows-Taschenrechner rechnet seit einger Zeit mit einer eigenen Langzahlbibliothek

-
Aber verratet bitte nicht, dass double auch eine Fließkommazahl ist...
-
Nö, double sind einfgach zwei integer, die sich gegenseitig helfen. Sieht man ja schon am Namen!
