Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

11

14.12.2007, 21:18

Wie schon gesagt wurde, Fliesskommazahlen haben eben Ungenauigkeiten, damit muss man als Programmierer leben. Strategien dazu sind:
- double
- unendlich lange Zahlen, sind aber sehr langsam. Dafür gibt es Bibliotheken.
- Bessere Algorithmen. Z.B. statt immer 0.1 pro Schleife dazuzuzählen, wobei sich Fehler akkumulieren, n*0.1 dazuzählen wobei n integer) die Schleifenzahl ist.
- Kritische Sachen wie riesenzahl+kleine Zahl vermeiden.
- Immer wieder "renormieren" (z.B. wie Du sagst, auf 5 Stellen runden wenn Du weisst Du hast imer nur 5 Nachkommastellen). Oder einen Einheitsvektor den du ständig drehst ab und zu auf die Länge eins normieren etc.

Einen Königsweg der immer sinnvoll ist und alle Probleme löst gibt es nicht.
"Games are algorithmic entertainment."

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

15.12.2007, 11:58

Zitat von »"Phil_GDM"«


Entweder mit int arbeiten, wenns genau sein muss, oder
wenn man wirklich float-werte auf gleichheit prüfun muss, dann immer
einen folgendermaßen:

C-/C++-Quelltext

1
2
3
float const EPSILON = 0.00000001f;

bool compare(float a, float b) {return (a < b + EPSILON) && (a > b - EPSILON);}


Wieso das Rad immer 2x erfinden?

C-/C++-Quelltext

1
2
3
4
5
6
#include <cfloat>

bool compare( float a, float b, float epsilon = FLT_EPSILON )
{
  return ( fabsf( a-b ) < epsilon );
}


Zitat von »"Osram"«


- double


- long double
@D13_Dreinig

13

16.12.2007, 01:22

@Bugger: Nicht wirklich. std::floor aus <cmath> rundet nicht im mathematischen Sinne, genau so wenig, wie es std::ceil tut. Dafür addiert man 0.5f und nutzt dann std::floar, dann rundet man damit korrekt ^^
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

14

22.12.2007, 16:25

Sorry dafür, dass ich immer so lange zum Antworten gebraucht habe, ich hatte kein eigenes Internet und die Beschaffung eines solchen :roll: war immer eine äußerst mühselige Prozedur. Doch die Zeiten sind nun vorbei, ich hab mir jezt ein mobiles Internet besorgt und das rennt perfekt.

@Osram: Die Idee mit dem n ist super, so was habe ich gesucht.
mit double hats genau so wenig funktioniert.
Die Idee mit dem Vector finde ich cool, floor klingt aber einfacher und lesbarer. Mal sehen für was ich mich entscheide

@Nox: Genau diesen Suchbegriff gibts bei Google nicht, ich nehme aber an ich finde unter newtonsches Näherungsverfahren was ich brauche

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

15

23.12.2007, 12:35

Wenn ich solche Ergebnisse reinstelle sind es meistens die ersten Treffer ;) .
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

16

02.01.2008, 13:43

So ich habe mich für den Newton entschieden und folgenden Code aufgestellt:

C-/C++-Quelltext

1
2
3
4
float xn=0;
while (!compare(GetY(Coeff, Expon, xn), 0)){
        xn = xn - (GetY(Coeff, Expon, xn)/GetYDer(Coeff, Expon, xn, 1));
}

also Formel: NewX = OldX - (f(X)/f'(X))
Aber xn nähert sich nicht an eine Zahl an sondern schwankt einfach irgendwo wild herum. Ich komm einfach nicht drauf was da falsch ist. Wahrscheinlich hab ich die Methode falsch verstanden.

Achja, die Funktionen:
compare -> siehe oben (Phil_GDM)
Coeff und Expon sind die Koeffizienten und Exponenten der Funktion, gibt das Glied an, is aber hier ned wichtig
GetY (float Koeffizienten[25], int Exponenten[25], X) findet das Y zu einem X
GetYDer (float Koeffizienten[25], int Exponenten[25], X, Ableitungsgrad) findet das Y' / Y''''''''' oder wie viele ' auch immer zu einem X

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

17

10.01.2008, 14:01

so, ich schreib da mal was, damit der thread wieder nach oben gepusht wird.

Werbeanzeige