Float-rechnungen/Ungenauigkeit? Das kann doch nicht sein...?
Übersicht

![]() |
ChriseBetreff: Float-rechnungen/Ungenauigkeit? Das kann doch nicht sein...? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Miteinander!
Endlich ist Wochenende und man kann sich wieder etwas mehr dem Programmieren widmen... Allerdings treten dadurch auch viel öfter irgendwelche Ungereimtheiten auf, wie bei mir beispielsweise ![]() Natürlich teste ich wieder viel mit Netzwerk etc. herum, im "Auftrag" von LlamaNet selbst verständlich und dachte mir ich bin ja so gefuchst und teste mit Simulationen herum. Genauergesagt Planetensimulation Also versende ich per Float-übermittlung (basiert auch wirklich auf Write/ReadFloat) die Werte, sprich Position,Masse, usw. alles was dafür wichtig ist und in Rechnungen in Frage kommt. Ich gleiche jetzt Clients und Host so ab: Host schickt die Nummer aktuellen Berechnungsschritt an die Clients. Der Client errechnet die Differenz von seinem letzten Rechenschritt und dem neuen und rechnet genauso viele Schritte nach wie der Host. Ich habe auch durch zahlreiche Tests nachgewiesen, Client und Host rechnen genausoviele Schritte. An der Schritt-zahl liegt es also nicht. Und dennoch: Bei einigen der Planeten kommt es zu einer Abweichung von der dritten bis zweiten Stelle nach dem Komma! ![]() Ich habe das ganze mit anderen, sowie Lokal getestet und immer wieder kam es zu derartigen Abweichungen. Am PC kanns also auch nicht liegen. Sonst müssten die Werte Lokal ja auch exakt sein. An was kann das liegen? Ich bin ratlos! ![]() Vielen Dank für Hilfe! lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
- Zuletzt bearbeitet von Chrise am Fr, Okt 15, 2010 23:57, insgesamt einmal bearbeitet
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Uhm... Hast du Logdateien, die die Berechnungen / Werte mitschreiben?
An Irgendeiner Stelle muss ja ein Informationsverlust passieren... |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kann ich einbauen, wenn es für die Problemlösung (euch) hilfreich ist, das wäre kein Ding. Die Frage wäre dann nur, ob nach jeder Rechenoperation loggen (also +/-/*/% wie auch alles andere (sin/cos)) oder nur nach einem Schleifendurchlauf?
EDIT: Bzw. kann das denn überhaupt sein, dass ein Computer sich so drastisch "verrechnet"? Das ist doch im Prinzip nicht möglich oder? Kenn mich jetzt nicht so sehr mit einem Computer was die eigen-Materie betrifft aus... lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Besonders interessant wäre erst mal, welche Exakte Zahl gesendet/empfangen wird, und dann erst mal per Schleifendurchlauf... So könnte man das Problem vermutlich eingrenzen.
Zur Not halt tatsächlich jede Rechenoperation - kann mir aber eigentlich nicht vorstellen, dass sich die Werte dadurch unterscheiden... |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
das seltsame ist ja auch, dass ein und der selbe PC auch utnerschiedliche Werte herausbekommt ![]() Wäre ja blöd, wenn ein und der selbe PC sich bei den gleichen Aufgaben etwas unterschiedliches ausrechnet. Also gesendete Werte sind wirklich exakt gleich den "originalen" Was ich mir auch schon gedacht habe ist: Ein Taschenrechner rechnet doch mit 9 Kommastellen, zeigt aber nur 8. Was wäre, wenn das hier ähnlich wäre? Der Host hat eine zusätzliche Kommastelle während er einen Wert mit einer Kommastelle weniger schickt. Wäre das möglich? Allerdings handelt es sich aber auch momentan um exakte Werte. Also "2e10" o.ähnliche.... also keine Krummen zahlen... lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hättest du vielleicht ein Testprogramm, mit dem man herum experimentieren kann?
Irgendwo musst du einen Fehler eingebaut haben ![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
Xeres hat Folgendes geschrieben: Hättest du vielleicht ein Testprogramm, mit dem man herum experimentieren kann?
Irgendwo musst du einen Fehler eingebaut haben ![]() Wie kann ich dich jetzt noch kontaktieren? ICQ, nur PM hier im Forum o.ä.? Ich wäre gerne bei der Problemlösung dabe und könnte dir die Sache dann direkt mal schicken ![]() lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich wurde aus deinem Beitrag leider nicht so richtig schlau, was genau dein Programm macht, machen soll und was es falsch macht. Gleiche Rechnungen sollten eigentlich auf derselben Maschine auch zu gleichen Ergebnissen führen. Blitz' Read/WriteFloat überträgt auch die vollständigen Floatwerte. Problematisch wäre, wenn du irgendwo zwischendrin nach/von Strings/Ints konvertierst. (Zum Beispiel könnte es Rundungsfehler geben, wenn du irgendwo mit deiner Schrittdifferenz multiplizierst.) Interessant zu wissen wäre auch, wie viele Stellen vor dem Komma denn richtig sind. Das Komma kann ja beliebig gleiten (wie der Datentypname schon sagt ![]() |
||
MrKeks.net |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vermutlich eine Deltavariable die bei Netzwerkspielen notwendig ist. Denn anders kann ich es mir nicht vorstellen, das selbst auf ein und dem selben Rechner Variablen unterschiedlich berechnet werden. Das passiert nicht. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
diese falsche Berechnung kommt zufällig zustande und liegt an der Recheneinheit die grosse Zahlen in matematischer Vorm umrechnet. Diese ungenauigkeit ist im selben Task immer gleich. Aber schon bei zwei verschiedenen Task kann es zu solchen rechen ungenauigkeiten kommen. Das liegt daran das der Scheduller der die einzelnen Rechenschritte aufteilt aus Zeitgründen die letzten stellen nicht immer verwendet. Daher sind es zwar Floud Zahlen aber nur mit einfacher genauigkeit. Wenn du möchtest das die Rechnungen immer exact gleich sind must du die Fliesskomma Aritmetik Einheit direkt verwenden. In BB gibts das leider nicht. PureBasic kann das und einige DLL bieten diese Funktion an. Gruss TFT |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
![]() |
faeX |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sogesehen dürfte es keine Abweichungen geben, vorrausgesetzt Server und Client laufen synchron. Eine kleine Abweichung wirst du immer haben, da der Client auch etwas braucht um die Zahl der Durchläufe zu empfangen und umzusetzen. Aber die vergrößert sich eben nicht im Laufe der Zeit. Vielleicht lässt du einfach mal alles mit 10facher Geschwindigkeit laufen, und guckst, ob sich die Abweichung vergrößert.
Am besten schickst du uns auch einfach mal den Code, dann kann man dir auch besser helfen. ![]() |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
tft hat Folgendes geschrieben: Das liegt daran das der Scheduller der die einzelnen Rechenschritte aufteilt aus Zeitgründen die letzten stellen nicht immer verwendet. Daher sind es zwar Floud Zahlen aber nur mit einfacher genauigkeit.
Das stimmt nicht. Der Scheduler kann nicht einfach einzelne Berechnungen mittendrin abbrechen, um Zeit zu sparen - so funktionieren CPUs nicht ![]() In der Tat sollte die selbe Berechnung auf der selben Maschine das selbe Ergebnis haben. Bei gleichem Input liefert eine intakte CPU immer das gleiche Ergebnis - sonst wäre sie ja ziemlich nutzlos. Die Vermutung liegt also nahe, dass Client und Server nicht die exakt gleichen Berechnungen durchführen (hast du Dinge drin, die von MilliSecs oder Timern abhängen?). Noch eine Anmerkung am Rande: Verschiedene Computer können bei gleichen Berechnungen tatsächlich verschiedene Ergebnisse erhalten, was hauptsächlich daran liegt, dass Intel- und AMD-Prozessoren verschieden runden. Die Unterschiede liegen zwar in der letzten Stelle, aber je nach Anwendung kann das schon einen Unterschied machen (z.B. bei Physikengines). |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Lastmayday |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich tippe mal darauf das er für die bewegungen MilliSecs() direkt verwendet und nicht den zeitwert zwischenspeichert. MilliSecs() läuft ja weiter und wartet nicht.
mfg Lastmayday (ohnoes Noo war schneller ;_; ) |
||
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also gleich mal die Tatsachen:
Ich verwende keine Millisekunden-abhängigkeit wodurch so ein Fehler entstehen könnte, dann müsste ich den Fehler ja gar nicht erst suchen, sondern hätte ihn klar auf der Hand. Bisher ist es einfach einer verschachtelte For-Each schleife die in einer bestimmten Anzahl wiederholt werden. Sprich: BlitzBasic: [AUSKLAPPEN]
wobei x bei host und client immer gleich ist, das haben Xeres und ich gestern zur genüge ausgetestet... Xeres hat auch die FLoat-übertragung per LlamaNet getestet und hat gemeint, dass es immer exakt arbeitet, andere Ergebnisse hätte ich aus früheren Tests mit Llama auch nicht erwartet... Ich bin immernoch ratlos. Ich werde jetzt dann mal schaun, ob die Clients alle unter sich die selben ergebnisse haben. Wenn dem so wäre, dann liegt es irgendwo doch an der Übertragung mal sehn ![]() lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
dann schau dir mal bei Intel direkt die infos zu diesem Thema an. Habe vor 4 Jahren schon das Problem gehabt. Leider habe ich keinen Link zur hand. Aber es läst sich einfach nachfollziehen. Führe 10 Milionen mal die gleiche Rechnung durch. Zum Beispiel 1.9877876/0.273663 . Du wirst festlellen das du im bereich > 0.00001 einiges an ungenauigkeit bekommst die föllig willkürlich sind. Das wird durch die CPU verursacht. Da sie nur noch sellten eine eigene FL besitzt. Innerhalb eines Programmes ist das Egal. Aber zum Abgleich zwischen Zwei Rechnern wo diese Ungenauigkeit nicht syncron eintrifft kommt es zu fehlern. Die einzige Lösung ist die verwendung von Doppelt genauen Zahlen. Das gibts in BB aber nicht. Daher helfe ich mir mit dem Abschneider der Zahl. 5 Stellen hinterm Komma scheinen noch zu funktionieren. Gruss TFT |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
habe etwas in meinem Code Fundus in sachen 3D geschaut. Ich habe sogar das Problem teilweise damit gelöst. Das ich nur Interger verwendet habe. Da gibt es keine Rundung. Es ist egal ob man mit 100.304998 oder 100304998 rechnet. Gruss TFT |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich habe das Ganze nun mehr als ausführlich getestet. Auch mit der von Dir vorgeschlagenen Division, TFT. Bei mir kommt da immer exakt das selbe Ergebnis raus,unter B3d wie unter BMax.
Was anderes könnte ich mir auch nicht erklären, da es der Funktionsweise eines Rechners widersprechen würde. Wenn Du also bei deinen Testläufen sporadische "Ausreißer" hast würde ich dir empfehlen dir eine neue CPU zuzulegen - deine aktuelle scheint defekt zu sein. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
BladeRunner hat Folgendes geschrieben: Wenn Du also bei deinen Testläufen sporadische "Ausreißer" hast würde ich dir empfehlen dir eine neue CPU zuzulegen - deine aktuelle scheint defekt zu sein. Ich weiß jetzt nicht ob du auf TFTs Sache ansprichst oder meine ![]() Aber wenn du meine CPU meinst, dann müsste Demnach Xeres CPU auch kaputt sein. Das müsste doch recht unwahrscheinlich sein oder? ![]() Also ich habe gestern auch nochmal getestet. Unter ein und der selben ausgeführten Exe kommen egal bei welchen Rechnungen immer die selben Ergebnisse heraus. Ähnlich nach dem Motto BlitzBasic: [AUSKLAPPEN]
Das Problem scheint nur in zwei Tasks aufzutauchen. Ich werde mir nochmal ein paar Tests überlegen, mit denen ich der Sache auf die schliche kommen kann... lg Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey, Chrise, langsam werde ich hier schon fast aggressiv. Hast du noch vor, irgendwas konkretes in diesen Thread zu schreiben? Eine etwas genauere Beschreibung, was du machst und was dabei für genaue komische Effekte auftreten, bedeutungstragende Codeauszüge vielleicht sogar? Und hast du eventuell vor, auch andere Beiträge ernsthaft zu lesen? Es ist absolut eindeutig, wen BladeRunner anspricht - siehe zweiter Satz, letztes Wort in seinem Beitrag. | ||
MrKeks.net |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja Chrise, du solltest den Leuten hier vielleicht die Gelegenheit geben mit zu raten...
Normalerweise berechnet auch mein Rechner immer das gleiche Ergebnis mit der gleichen Eingabe... und dann gibt es da Chrise Planetensimulation: Code: [AUSKLAPPEN] Server: Psi / Cos(Psi) = 285.969 | 0.27511
Client: Psi / Cos(Psi) = 285.969 | 0.275109 Print(Cos(285.969)) = 0.275117 BB macht definitiv noch was anderes als es anzeigt. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group