JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=bc0ddad846d54daa78051f9b0c66e28cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

runden
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 04.06.2005, 21:31    Titel: runden Antworten mit Zitat

So, wie kann man floats runden? Ich hatte mal so ne Idee mit in ints casten damit beim dividieren nachkommstellen wegfallen können.
Aber das ist immer so kompliziert und wahrscheinlich eine sehr schlechte Lösung. Welche besseren kennt ihr?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 04.06.2005, 21:34    Titel: Antworten mit Zitat

Runden ist in C und C++ immer so ne Sache gewesen, aber es geht:

CPP:
double Round(double Zahl, unsigned int Stellen)
{
    Zahl *= pow(10, Stellen);
    if (Zahl >= 0)
        floor(Zahl + 0.5)
    else
        ceil(Zahl - 0.5);
    Zahl /= pow(10, Stellen);
    return Zahl;
}
// 1. Änderung ohne Kommentar
double Round(double Zahl, unsigned int Stellen)
{
    Zahl *= pow(10, Stellen);
    if (Zahl >= 0)
        Zahl = floor(Zahl + 0.5)
    else
        Zahl = ceil(Zahl - 0.5);
    Zahl /= pow(10, Stellen);
    return Zahl;
}
// 2. Änderung: Einführen der Potenzgesetze
double Round(double Zahl, int Stellen)
{
    Zahl *= pow( 10, Stellen);
    if (Zahl >= 0)
        Zahl = floor(Zahl + 0.5)
    else
        Zahl = ceil(Zahl - 0.5);
    Zahl *= pow(10, -Stellen);
    return Zahl;
}
// 3. Änderung: Rundung überarbeitet
double Round(double Zahl, int Stellen)
{
    Zahl *= pow( 10, Stellen);
    Zahl = floor(Zahl + 0.5)
    Zahl *= pow(10, -Stellen);
    return Zahl;
}
// 4. Änderung: Zusammenfassen
double Round(double Zahl, int Stellen)
{
    return floor(Zahl * pow( 10, Stellen) + 0.5) * pow(10, -Stellen);
}
// 5. Änderung: Laufzeitverhalten verbessern
double Round(double Zahl, int Stellen)
{
    double v[] = { 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8 };  // mgl. verlängern
    return floor(Zahl * v[Stellen] + 0.5) / v[Stellen];
}


ACHTUNG: läuft vermutlich nicht auf jedem Compiler, deshalb muss man testen welche Version passt! Die Beste ist natürlich die 5. Version

- 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 04.06.2005, 21:40    Titel: Antworten mit Zitat

ok, bloß
ich habe keine Ahnung warum das wie funktioniert. Wäre vielleicht interessant das zu erläutern.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 04.06.2005, 21:46    Titel: Antworten mit Zitat

Schau Dir mal die 2. Funktion an.

Schnapp Dir Papier und Stift sowie Taschenrechner und dann legste mal los Wink Klar die Letzte ist schwer zu verstehen, aber das Prinzip sieht man in der 2. Funktion sehr gut.
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 04.06.2005, 21:49    Titel: Antworten mit Zitat

http://www.c-plusplus.de/forum/viewtopic-var-p-is-284467.html

hehe
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 04.06.2005, 21:54    Titel: Antworten mit Zitat

Stimmt da gab es das Smile

Hatte den Code noch in meiner Datenbank Smile
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 04.06.2005, 22:00    Titel: Antworten mit Zitat

ok, danke, das sollte mir weiterhelfen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 05.06.2005, 07:07    Titel: Antworten mit Zitat

Bei den ersten drei fehlt jeweils ein Semikolon. Rolling Eyes
Lässt sich ja leicht beheben.


TROTZDEM: (Borland C++ Builder 5 Std.)

Die 1. Methode mag bei mir gar nicht.

Die 2. funktioniert wunderbar.



Die 3., 4. und 5. runden bei Negativwerten bei 5ern falsch.

Z.B.: -123,45 wird dort bei 1 Stelle runden zu -123,4 - bei der 2. Methode wie es sein soll: -123,5


Also am besten die 2. Methode nehmen, wenn Du richtig runden willst. Wink
_________________
Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 05.06.2005, 07:55    Titel: Antworten mit Zitat

nepomuk hat Folgendes geschrieben:

Z.B.: -123,45 wird dort bei 1 Stelle runden zu -123,4 - bei der 2. Methode wie es sein soll: -123,5


Also am besten die 2. Methode nehmen, wenn Du richtig runden willst. Wink


??? versteh ich das jetzt richtig? Also...

das is kein Fehler. Bei -123,45 runded er auf, also -123,4, weil es negative Zahlen sind d.h.-123,5 < 123,45 < -123,4 Wink

Gruß DirectXer


Zuletzt bearbeitet von DirectXer am 05.06.2005, 07:58, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 05.06.2005, 07:56    Titel: Antworten mit Zitat

also bei mir rundet die 5. perfekt?

wie gibst du denn die Zahl aus? mit cout?
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 05.06.2005, 08:54    Titel: Antworten mit Zitat

@ DirectXer

Nö, funzt bei negativen doch genauso. Wink
Dafür sind ja die If-Abfragen da.

In dein Konzept passt keine der beiden Methoden? Rolling Eyes

Verdeutlichung

5. Methode, 1 Stelle:

-123,44 => -123,4
-123,45 => -123,4
-123,46 => -123,5


2. Methode, 1 Stelle:

-123,44 => -123,4
-123,45 => -123,5
-123,46 => -123,5

@ Patrick:

Ja cout. In diesem Falle aber wohl egal? Printf wird wohl auch nicht anders sein.


[EDIT]
1. Funzt schon, hatte zuvor die darüber, unvollständige, probiert.
_________________
Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 05.06.2005, 09:31    Titel: Antworten mit Zitat

Nein, streams haben eine präzisionsvariable für die Ausgabe von Dezimalwerten um pufferüberläufe zu verhindern. In der Regel ist die Präzisionsvariable auf 5 oder 6 eingestellt, deshalb wird der Rest einfach "Abgeschnitten" für die Ausgabe.

CPP:
inline const double Round (double value, unsigned int pos)
{
    static const double      v[] = { 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9 };
   static const double inv_v[] = { 1, 1/10, 1/1e2, 1/1e3, 1/1e4, 1/1e5, 1/1e6, 1/1e7, 1/1e8, 1/1e9 };
   return (floor(value * v[pos] + 0.5) * inv_v[pos]);
}

double PI = 3.1415926535897932384626433832795;
#include <iostream>
#include <cmath>
#include <iomanip>

int main (void)
{
   std::cout << std::setprecision(10) << Round (PI, 8);

   std::cin.get();

   return 0;
}


_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 05.06.2005, 10:41    Titel: Antworten mit Zitat

@ Patrick:

Dein Quelltext funzt nur mit Stellen größer 1, aber nicht mit 1 selbst.

Sonst wird dort genauso falsch gerundet. Wink Rolling Eyes
_________________
Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 05.06.2005, 10:43    Titel: Antworten mit Zitat

Komisch bei mir geht es ohne Probleme?

Naja wer rundet denn schon niedriger als 2?
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 05.06.2005, 11:13    Titel: Antworten mit Zitat

Patrick hat Folgendes geschrieben:
Komisch bei mir geht es ohne Probleme?

Naja wer rundet denn schon niedriger als 2?


Man kann ja auch Zahlen runden, die man vorher nicht weiß, also in-Game

@Nepomuk
dein => Zeichen, heißt das jetzt "Größer gleich" oder "entspricht" oder was?

zu dem vorigen Satz bei dir hat mich
nepomuk hat Folgendes geschrieben:
-123,45 wird dort bei 1 Stelle runden zu -123,4 - bei der 2. Methode wie es sein soll: -123,5
gestört. Aber naja, auch egal Smile

Gruß DirectXer


Zuletzt bearbeitet von DirectXer am 05.06.2005, 11:17, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum