Forum: PC-Programmierung C -1.#IND00 nach mehreren Schleifendurchläufen


von Tom (Gast)


Lesenswert?

Hallo,

ich habe in C eine Schleife, die eine Reihe von Berechnungen mit floats 
ausführt und dabei test[][] immer weiter anpassen soll.
Dabei kommt keine Division vor!

Nach der Schleife lasse ich mir test[0][0] ausdrucken und bekomme dabei 
höchst seltsame Ergebnisse:
Schleifendurchlauf 33: -0.5...
Schleifendurchlauf 34: -0.7...
Schleifendurchlauf 35: -1.1...
Schleifendurchlauf 36: -5.3...
Schleifendurchlauf 37: -1.#IND00
Schleifendurchlauf 38: -1.#IND00
[...]

Oft kommt dies ja durch eine Division durch 0, jedoch dividiere ich 
nicht und außerdem wird der Code ja bis Schleifendurchlauf 36 
durchlaufen.

Ich bin echt ratlos und wäre dankbar für ein paar Tipps, an was das 
liegen könnte!

Viele Grüße,
Tom

von Karl H. (kbuchegg)


Lesenswert?

Tom schrieb:
> Hallo,
>
> ich habe in C eine Schleife, die eine Reihe von Berechnungen mit floats
> ausführt

Solange du nicht weißt, was du dabei tust, sollst du auf einem PC keine 
float verwenden. Verwenden statt dessen double, die sind ein wenig 
einfacher zu handhaben, wenn sie auch das grundsätzliche Problem nicht 
lösen sondern nur verkleinern.
Aber auf einem PC gibt es nur einen einzigen Grund float zu verwenden: 
wenn du Milliarden davon manipulieren musst. In allen anderen Fällen 
immer double benutzen.

Mit float hast du ungefähr 6 bis 7 signifikante Stellen. Achtung: 
signifikante Stellen sind nicht Nachkommastellen! Bei der Zahl 4321.7658 
hast du 4 Vorkommastellen und noch in etwa 2 bis 3 sauebere 
Nachkommastellen. Mit jeder Berechnung die du machst, verringert sich 
aber deren Signifikanz. Durch Rundungsfehler schrumpfen die 
signifikanten Stellen ganz schnell auf 5 bis 6 und kurz darauf auf 4 bis 
5 zusammen. Deine Ergebnisse sind immer ungenauer, je mehr du damit 
rechnest. Dassselbe Problem hast du im Prinzip auch mit double. Nur 
startest du erst mal mit rund 15 signifikanten Stellen. D.h. du hast 
mehr Berechnungssspielraum ehe der Fehler so groß wird, dass er dir 
deine Ergebnisse komplett versaut.


Wenn du dann immer noch nicht weiter kommst, dann wird dir wohl nichts 
anderes übrig bleiben, als dein hochgeheimes Programm mal herzuzeigen.


Rechnen mit Floating Point ist wie das Umschaufeln von Sandhaufen.
Je öfter man es tut, desto weniger Sand und desto mehr Schmutz hat man.

von Frank M. (aktenasche)


Lesenswert?

ohne code geht nix

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.