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

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

01.03.2008, 23:17

Genauigkeit einer Fließkommazahl festlegen?

Ich habe eine float Variable die bei Berechnungen immer mal wieder *leicht* ungenaue Werte abliefert. Statt z.B. 0 habe ich dann irgendwo nach 10 Nachkommastellen doch noch irgendeinen Wert.

Ich weiß woran das liegt etc und wollte eigentlich nach gewissen Operationen eigentlich die Genauigkeit einer Fließkommazahl auf z.B. 10 Nachkommastellen beschränken und alles danach "ausnullen". Aber wie mache ich das?

2

02.03.2008, 03:42

Einfach multiplizieren, runden und wieder dividieren.

x = 0,01234567891234;
y = x * 10^10; // = 123456789,1234
y = round(y); // = 123456789,0
y = y / 10^10; // = 0,0123456789

3

02.03.2008, 15:21

Oder bei der Ausgabe nur X Nachkommastellen anzeigen.
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

02.03.2008, 17:57

Wieso willst du die Genauigkeit denn noch mehr einschränken? Wenn du eine Fließkommazahl auf 0 Testen willst nimmst du halt einen Deltawert:

C-/C++-Quelltext

1
2
3
4
#include <cfloat>

if ( value < FLT_EPSILON )
  printf( "value ist 0" );
@D13_Dreinig

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

5

03.03.2008, 14:33

In meinem Fall geht es darum in einer rekursiven Funktion Werte die 0 sein sollten, aber nur eben nahe darankommen, als 0 zu behandeln. Sonst rechnet man mit "fehlerhaften" Werten weiter und hat (in meinem Fall) am Ende einen Vektor der nicht paralel zur X bzw Y Achse ist. Mit Ausgabe verändern wäre es also nicht getan.

Schade, ich hatte gehofft dass es dafür einen "einfachen" Weg gibt, der direkt auf die Mantisse zugreift oder dergleichen. Dann eben doch den mathematischen Weg.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

03.03.2008, 14:43

Ja, hochkomplex das Ganze! :)

C-/C++-Quelltext

1
2
if ( fabsf( value ) < FLT_EPSILON )
  value = .0f;
@D13_Dreinig

7

03.03.2008, 19:55

Zitat von »"Das Gurke"«



Schade, ich hatte gehofft dass es dafür einen "einfachen" Weg gibt, der direkt auf die Mantisse zugreift oder dergleichen.

Klar kannst du das. Ein wenig Bit geschupse und es sollte passen. Nur könnte dann dein Programm evtl. nicht auf allen Compilern/Prozessoren/Betreibssystemen gleich funktionieren, und dieser lowlevel Kram ist schwer zu lesen. Aber trotzdem sollte es in C++ gehen.
Lieber dumm fragen, als dumm bleiben!

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

8

03.03.2008, 20:43

Zitat von »"Jonathan_Klein"«

Nur könnte dann dein Programm evtl. nicht auf allen Compilern/Prozessoren/Betreibssystemen gleich funktionieren [...]
Genau da liegt der Hase im Pfeffer :(

Danke David, daran nur die Stellen "nahe 0" zu runden hatte ich irgendwie noch garnicht gedacht. Ist vermutlich sogar besser als dass, was ich mit dem "allgemeinen" Runden erreicht hätte.

Werbeanzeige