Umgang mit Rundungsfehler
-
@SeppJ sagte in Umgang mit Rundungsfehler:
Hast du da jetzt wirklich drüber nachgedacht? Denn es sieht aus wie fix ausgedacht. Hast du wirklich einen Grund für 0.00001 statt 0.00001525878? (Die Zahl 0.00001525878 ist kein Zufall und solltest du wiedererkennen, wenn du wirklich nachgedacht hast). Warum 1,000,000 statt beispielsweise 1,048,576? Hast du einen Grund für das fixe Raster? Hast du über die Definitionen von Strecken und Schnittpunkten auf einem Raster nachgedacht?
Du hast mich ertappt;) nein so genau habe ich nicht nachdacht. Stellt dir vor du hast ein Polygon mit N-Vertices. Welche willkürliche punkte haben können, aber da diese sich ja auch im selben Wertesystem befinden und ich bspw. random die punkte willkürlich bestimmte, können diese punkte jauch nicht 0.00001 sein sonder 0.00001525878 !? oder?
Wie gehe ich da nun vor?
-
@SeppJ sagte in Umgang mit Rundungsfehler:
Warum 1,000,000 statt beispielsweise 1,048,576?
ja eigentich is das sogar + - beliebigt.. aber gröér kleiner ~1.000.000 past
@SeppJ sagte in Umgang mit Rundungsfehler:
Hast du einen Grund für das fixe Raster?
naja da ganze ist für eine Simulation welche 0,00001 mm genau sein soll...
-
@SoIntMan sagte in Umgang mit Rundungsfehler:
Stellt dir vor du hast ein Polygon mit N-Vertices.
[…]
naja da ganze ist für eine Simulation welche 0,00001 mm genau sein soll...Jetzt kommen wir langsam irgendwohin. Das klingt mal so langsam nach einer echten Anforderung. Erklär mal mehr!
Wenn deine Genauigkeit 0.00001 sein soll, sollte deine Rechnung meistens feiner sein, kommt aber drauf an. Verdächtig ist aber auch, dass du andererseits die Obergrenze 1,000,000 nennst. Das sind 11 Größenordnungen. Die genaueste Messungen, die die Menschheit bisher jemals durchgeführt hat, sind auf ca 13-15 Stellen genau. Arbeitest du wirklich in so einem Bereich, oder ist das auch wieder nur willkürlich aus der Luft gezogen?
-
@SeppJ sagte in Umgang mit Rundungsfehler:
Jetzt kommen wir langsam irgendwohin. Das klingt mal so langsam nach einer echten Anforderung. Erklär mal mehr!
Wenn deine Genauigkeit 0.00001 sein soll, sollte deine Rechnung meistens feiner sein, kommt aber drauf an. Verdächtig ist aber auch, dass du andererseits die Obergrenze 1,000,000 nennst. Das sind 11 Größenordnungen. Die genaueste Messungen, die die Menschheit bisher jemals durchgeführt hat, sind auf ca 13-15 Stellen genau. Arbeitest du wirklich in so einem Bereich, oder ist das auch wieder nur willkürlich aus der Luft gezogen?Hey, ok dann lass die Obergrenze einfach weg, ist erstmal auch nicht wichtig (willkürlich). Anhand von einem Formel/Funktion wird ein Polygon berechnet. eine art Arc.segment bestehend aus n Line Segmenten.. ich denke durch Sin/cos kommen dann auch ganz wilde zahlen raus. Ich kann die Ergebnisse dann auch runden, das wäre natürlich hein ansatz, So ganz tief habe ich das noch nicht evaluiert, aber auch 0,001 wäre noch ok. muss ich noch klären;)
Aber jetzt hab ich sogar noch eine weiter frage. ich habe eine Slope funktion welche mir die Steigung eine line zwischen zwei punkten berchenet:
double slope = (a->y - b->y) / (a->x - b->x);
wenn ich nun 2 punkte paare einsetze
A: 300/400 B:300/300 => Slope -0
A: 300/400 B:300/600 => Slope +0Wenn ich die beiden slopes vergleiche kommt true raus, aber eigenlich sollte es falsch sein wegen dem vorzeichen;) dann hab ich auf das erste bit geschaut:
BOOL X1 = (BOOL)((int32_t)slopeA & 0x80000000); BOOL X2 = (BOOL)((int32_t)slopeB & 0x80000000); BOOL X3 = (BOOL)((int32_t)slopeA & 0x1); BOOL X4 = (BOOL)((int32_t)slopeB & 0x1);
aber hmm immer 0 !? zu blauäugig? bekomme ich das überhaupt raus?
-
Aber wozu ist das alles gut? Ist das eine Simulation wo Polygone durch die Gegend fliegen und du willst ausrechnen, ob sie sich stoßen?
Wenn ich die beiden slopes vergleiche kommt true raus, aber eigenlich sollte es falsch sein wegen dem vorzeichen;)
Wieso soll 0 nicht 0 sein?
-
@SeppJ sagte in Umgang mit Rundungsfehler:
Wieso soll 0 nicht 0 sein?
weil die steigung zwar jeweils 0 sind aber einmal nach recht oder nach links driften;)
Laut debugger seh ich auch 0.00000000 bzw. -0.000000000. müsste ja ein sign bit sein p.s. sollte auch int64_t nehme aber kein bit
-
@SeppJ sagte in Umgang mit Rundungsfehler:
Aber wozu ist das alles gut? Ist das eine Simulation wo Polygone durch die Gegend fliegen und du willst ausrechnen, ob sie sich stoßen?
ne ich schieße ein paar rays , linen durch und will auch sicherstellen dass sie treffen wo sie treffen sollen;)
-
Das ist aber nicht, was du berechnest. Die Steigung ist schließlich 0. Würde dir jedes Grundschulkind so ausrechnen und bestätigen können, dass die beide 0 sind.
Es gibt Funktionen in C, die dir das Vorzeichen korrekt liefern, ohne dich auf wilde Casts verlassen zu müssen. Aber wie gesagt, ist da eher ein Fehler in deiner Logik, dass du nicht die richtige Rechnung machst zu der Frage, die du beantworten willst.
@SoIntMan sagte in Umgang mit Rundungsfehler:
ne ich schieße ein paar rays , linen durch und will auch sicherstellen dass sie treffen wo sie treffen sollen;)
Bitte genauer! Was meinst du mit "sollen"?
-
@SeppJ sagte in Umgang mit Rundungsfehler:
Das ist aber nicht, was du berechnest. Die Steigung ist schließlich 0. Würde dir jedes Grundschulkind so ausrechnen und bestätigen können, dass die beide 0 sind.
Es gibt Funktionen in C, die dir das Vorzeichen korrekt liefern, ohne dich auf wilde Casts verlassen zu müssen. Aber wie gesagt, ist da eher ein Fehler in deiner Logik, dass du nicht die richtige Rechnung machst zu der Frage, die du beantworten willst.du hast recht..
@SeppJ sagte in Umgang mit Rundungsfehler:
Bitte genauer! Was meinst du mit "sollen"?
weil es sonst falsch wäre? wenn da ein schnittpunkt ist?
-
@SoIntMan sagte in Umgang mit Rundungsfehler:
@SeppJ sagte in Umgang mit Rundungsfehler:
Bitte genauer! Was meinst du mit "sollen"?
weil es sonst falsch wäre? wenn da ein schnittpunkt ist?
(Floating point-)arithmetisch ist da ja kein Schnittpunkt…
Da ich nicht die Antwort bekomme, die ich brauche, und du wahrscheinlich genauso genervt bist von meinen dauernden Gegenfragen: Ich will wissen, was du erreichen willst. Ganz weit weg von allen deinen konkreten Problemen mit Schnittpunkten und Steigungen. Nicht wie du es machst; nicht was deine Probleme dabei sind; nicht wie du denkst, dass das geht. Klassisches XY-Problem. Ich bin nämlich ziemlich sicher, dass du wahrscheinlich gar kein Problem hast, sondern dir nur selber eines einredest. Aber es gäbe auch genügend Fälle, wo du tatsächlich ein Problem haben könntest und die Lösung ganz woanders liegt, daher mag ich das auch nicht pauschal behaupten, ohne den genauen Anwendungsfall zu kennen.
-
@SeppJ sagte in Umgang mit Rundungsfehler:
Da ich nicht die Antwort bekomme, die ich brauche, und du wahrscheinlich genauso genervt bist von meinen dauernden Gegenfragen: Ich will wissen, was du erreichen willst. Ganz weit weg von allen deinen konkreten Problemen mit Schnittpunkten und Steigungen. Nicht wie du es machst; nicht was deine Probleme dabei sind; nicht wie du denkst, dass das geht. Klassisches XY-Problem. Ich bin nämlich ziemlich sicher, dass du wahrscheinlich gar kein Problem hast, sondern dir nur selber eines einredest. Aber es gäbe auch genügend Fälle, wo du tatsächlich ein Problem haben könntest und die Lösung ganz woanders liegt, daher mag ich das auch nicht pauschal behaupten, ohne den genauen Anwendungsfall zu kennen.
ja schwierig.. wir sollten mal ein Bier trinken:) naja ich mach mir nochmal Gedanken..