Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
SK Mini JLI'ler
Alter: 36 Anmeldedatum: 11.06.2005 Beiträge: 20
Medaillen: Keine
|
Verfasst am: 11.06.2005, 20:15 Titel: Dickes fettes DOUBLE/FLOAT-Problem! |
|
|
Moinsen!
Das Prob, das ich hab, ist sehr sehr merkwürdig und aufwendig zu beschreiben, ohne gleich mit Tipps, wie "du hast da ma 'float' anstatt 'double' verwendet", zubekommen.
Ich hab versucht ein Gleichungssystem zu lösen. Verschiedene Lösungen als DOS-Prog geschrieben. Danach in das eigentliche Prog kopiert (hab genau so konzipiert, dass ich kein Zeichen ändern musste). Als dann der Test kam, stürzte das Prog ab. Nach geschaut. Im Gleichungssystem entstand an entscheidener Stelle 0. Genau Null. Wirklich genau Null. Dann Gleichungssystem mit Taschenrechner und dem Prog im DOS-Prog gelöst. Es ging. ???????????????????????????
Test gemacht: Einfach eine Zahl berechen lassen. 1 : 19800 = 5,0505050505051e-5 (mit dem (Windows-)Taschenrechner) Das Programm, in dem das Gleichungssystem nicht lösbar war, ließ ich das auch berechnen. Dort kam aber 5.0505052058725e-005 raus.
Das Problem wärs ja nicht wenns die Stellen weit nachm Komma wärn, aber das das zu einer (genauen) NULL führt, raff ich ne.
Gut weiter. Danach hab ich bestimmte Header, Klassen und ähnliches aus den Prog entfernt. Reduziert auf ein winziges, funktionierte die Double-Genauigkeit (das Gleichungssystem auch) wieder. Prob is nur, dass das, was den Fehler verursacht (oder zu mindestens, wenn ichs eingebunden hab, der Fehler da ist), ist die Grafik-Ausgabe mit Hilfe von Direct3D 9
Und noch eine Komponente, dass aber nichts mit DirectX zu tun hat.
WIE KANN DAS SEIN??? DARF DAS ÜBERHAUPT SEIN??? Kann man durchbestimmte libs, header o.ä. die Standert-Typen beeinflussen (unwahrscheinlich). Un verallem wie krieg ich das weg? Hats was mit der Hardware zu tun (war aber auf jeden rechner war das bis jetzt)?
Ich bedanke mich im Voraus.
SK
PS: gruß homeless punkdrummer (ich werds dir auch noch zeigen, wenn ich zeit ab, im moment is schlacht) |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 11.06.2005, 20:26 Titel: Re: Dickes fettes DOUBLE/FLOAT-Problem!!!!!!!!!!!!!!!!!!!!!! |
|
|
SK hat Folgendes geschrieben: | WIE KANN DAS SEIN??? DARF DAS ÜBERHAUPT SEIN??? | Kann sein, darf sein, muss so sein!
SK hat Folgendes geschrieben: | Kann man durchbestimmte libs, header o.ä. die Standert-Typen beeinflussen (unwahrscheinlich) |
Ja, die Standardtypen können durch Redefinitionen beeinflusst werden und ein Undefiniertes Verhalten hervorrufen.
SK hat Folgendes geschrieben: | Un verallem wie krieg ich das weg? Hats was mit der | Na ja, bei so einer "geringen" Problembeschreibung hilft nur eines: Zeig uns die Stelle wo das Programm Abstürzt +-20 Zeilen. Der Debugger hilft Dir diese Position genau zu finden.
SK hat Folgendes geschrieben: | Hats was mit der Hardware zu tun (war aber auf jeden rechner war das bis jetzt)? | Interessante Theorie! Wir legen ein mit Marmelade beschmiertes Toastbrot auf den Tisch und schupsen es runter, es fällt vom Tisch und landet genau mit der Marmeladenseite zum Boden. Wen geben wir die Schuld? Murphy oder der Masse der Erde, oder sogar den Zeugen Jehovas? Fragen über Fragen
Nein im Ernst: Das wäre das Unwahrscheinlichste was es gäbe, das grenzt sogar schon an dem Unmöglichen.
Und ohne Aufdringlich oder Unhöflich zu sein (ich glaube meine Art ist bekannt und das ich es auch nicht so extrem meine...) solltest Du Dir dies hier nahelegen: http://www.lugbz.org/documents/smart-questions_de.html
Damit kann ich bzw. alle anderen hier Dir viel schneller und effizienter Helfen.
- Patrick _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 11.06.2005, 20:31 Titel: |
|
|
In C muss man darauf achten das Ganzzahldivisionen eine Ganzzahl zurückgeben (stark vereinfacht):
1/3=0
1/3.0f=0.33 (float)
1/3.0=0.33333333 (double)
Nehme dir Patricks Tips trotzdem zu herzen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 11.06.2005, 20:33 Titel: |
|
|
DirectXer
Was stimmt denn mit meinem Deutsch nicht?
FallenAngle84
Exakt! Aber bei dieser Problembeschreibung geht das nicht so leicht einen passablen Lösungsweg zu finden. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 11.06.2005, 20:44 Titel: |
|
|
Patrick hat Folgendes geschrieben: | DirectXer
Was stimmt denn mit meinem Deutsch nicht?
FallenAngle84
Exakt! Aber bei dieser Problembeschreibung geht das nicht so leicht einen passablen Lösungsweg zu finden. |
Sry, aber wieso DirectX??? _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 11.06.2005, 20:58 Titel: |
|
|
hat sich wohl vertan und seinen Psot gelöscht
Achja, bitte übertreibst nicht so mit den Ausrufezeichen. Ich weiß du denkst deine Frage wäre ganz besonders wichtig, das denk aber jeder hier. Also lass es einfach sein.
Ich habe mir mal erlaubt einige zu entfernen... _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
SK Mini JLI'ler
Alter: 36 Anmeldedatum: 11.06.2005 Beiträge: 20
Medaillen: Keine
|
Verfasst am: 11.06.2005, 21:02 Titel: |
|
|
Toll Patrick danke für dein Entgegenkommen. Hilft
mir nur net weil
sx = 1;
sy = 1;
sz = 1;
Dichte = 19800;
Masse = sx * sy * sz * Dichte;
s.MasseInvers = 1 / Masse;
unhabhängig von anderen code-Zeilen is.
in s.MasseInvers is nu
5.0505052058725e-005
drin un net
5,0505050505051e-5 wies sein müsste.
Könntest du das mit den Redefinitionen bissl gnauer erläuertern.
Thanks |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 11.06.2005, 21:15 Titel: |
|
|
SK
Och mein Komment hätte Dir eigentlich schon helfen können
1. Ordentlich casten
2. Für eine Ausgabe die Präzision höhersetzen! (Grund: Siehe Topic über das Runden in C++)
3. Irgendetwas
CPP: | #include <iostream>
#include <iomanip>
const int sx = 1;
const int sy = 1;
const int sz = 1;
const int weight = 19800;
const double invMass = 1.0 / static_cast<double>(sx * sy * sz * weight);
int main (void)
{
std::cout << std::setprecision(20) << invMass << std::endl;
std::cin.get();
return 0;
} |
Output: 5.050505050505050505051e-5
- Patrick
edit: Das mit der Redefinition, wird momentan nicht Dein Problem darstellen _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 11.06.2005, 21:22 Titel: |
|
|
*räusper* ehh, ich wollte erst was schreiben; habs mir dann aber och anders überlegt... ich kenn dich ja.
Gruß DirectXer |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
SK Mini JLI'ler
Alter: 36 Anmeldedatum: 11.06.2005 Beiträge: 20
Medaillen: Keine
|
Verfasst am: 11.06.2005, 21:28 Titel: |
|
|
OK vlei habsch mie da noch n bissl zu undeutlich ausgedrückt:
Da is kein 'int' und auch kein 'float'. Nur 'double'. Und die Ausgabe regel ich übers Überwachungsfenster im Debug-Mod; weil ich die Werte eigentlich garne wissen wil. Die müssen bloß stimmen. Und dat tun se net.
Und noch ma: der Fehler tritt nur auf wenn ich n bestimmte Komponente ins Programm einbaue, die aber rein gar nix mit dieser Berechnung zu tun ham.
(Hab ich das wirklich so dumm formuliert, dass das keiner gerafft hat.) |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 11.06.2005, 21:29 Titel: Re: Dickes fettes DOUBLE/FLOAT-Problem!!!!!!!!!!!!!!!!!!!!!! |
|
|
OK, ihr wolltet ja net anders...
Patrick hat Folgendes geschrieben: | SK hat Folgendes geschrieben: | WIE KANN DAS SEIN??? DARF DAS ÜBERHAUPT SEIN??? | Kann sein, darf sein, muss so sein!
SK hat Folgendes geschrieben: | Kann man durchbestimmte libs, header o.ä. die Standert-Typen beeinflussen (unwahrscheinlich) |
Ja, die Standardtypen können durch Redefinitionen beeinflusst werden und ein Undefiniertes Verhalten hervorrufen.
SK hat Folgendes geschrieben: | Un verallem wie krieg ich das weg? Hats was mit der | Na ja, bei so einer "geringen" Problembeschreibung hilft nur eines: Zeig uns die Stelle wo das Programm [/b]Abstürzt +-20 Zeilen. Der Debugger hilft Dir diese Position genau zu finden.
SK hat Folgendes geschrieben: | Hats was mit der Hardware zu tun (war aber auf jeden rechner war das bis jetzt)? | Interessante Theorie! Wir legen ein mit Marmelade beschmiertes Toastbrot auf den Tisch und schupsen es runter, es fällt vom Tisch und landet genau mit der Marmeladenseite zu[b]m Boden. Wen geben wir die Schuld? Murphy oder der Masse der Erde, oder sogar den Zeugen Jehovas? Fragen über Fragen
Nein im Ernst: Das wäre das Unwahrscheinlichste was es gäbe, das grenzt sogar schon an dem Unmöglichen.
Und ohne Aufdringlich oder Unhöflich zu sein (ich glaube meine Art ist bekannt und das ich es auch nicht so extrem meine...) solltest Du Dir dies hier nahelegen: http://www.lugbz.org/documents/smart-questions_de.html
Damit kann ich bzw. alle anderen hier Dir viel schneller und effizienter Helfen.
- Patrick |
so, das wars. Meinte die Groß- und Kleinschreibung. Hab den Post aber dann wieder gelöscht, weil 1. mir sowas auch immer passiert und 2. ich das für sinnloses OT-Gequatsche hielt...
Naja, wie dem auch sei, Gruß DirectXer |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 11.06.2005, 21:31 Titel: |
|
|
SK
Where is the problem? Nein, mal im ernst: Das Debug-Window hat eine nicht so hohe Präzision und die Debugversion ebenfalls nicht. Deshalb vertrau mehr diesem Output:
CPP: | #include <iostream>
#include <iomanip>
const double sx = 1.0;
const double sy = 1.0;
const double sz = 1.0;
const double Dichte = 19800.0;
const double MasseInvers = 1.0 / (sx * sy * sz * Dichte);
int main (void)
{
std::cout << std::setprecision(20) << MasseInvers << std::endl;
std::cin.get();
return 0;
} |
Und wenn Du mit double bzw. float rechnest: .0 bzw. .0f nicht vergessen! Sonst hat man ints.
- Patrick
DirectXer
Du willst mir irgendetwas sagen, doch ich weiß grade nicht was. *kratz* _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 11.06.2005, 21:36 Titel: |
|
|
dann les dir den Quote, den ich von deinem Text geschrieben hab, nochmal durch; und achte auf fettgedruckte Stellen. Ich hab alle kleinen Fehler so makiert
Gruß DirectXer |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
|