|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 04.06.2005, 21:31 Titel: runden |
|
|
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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 04.06.2005, 21:34 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 04.06.2005, 21:40 Titel: |
|
|
ok, bloß
ich habe keine Ahnung warum das wie funktioniert. Wäre vielleicht interessant das zu erläutern. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 04.06.2005, 21:46 Titel: |
|
|
Schau Dir mal die 2. Funktion an.
Schnapp Dir Papier und Stift sowie Taschenrechner und dann legste mal los 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 |
|
|
PeaceKiller JLI Master
Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 04.06.2005, 21:49 Titel: |
|
|
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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 05.06.2005, 07:07 Titel: |
|
|
Bei den ersten drei fehlt jeweils ein Semikolon.
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. _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
|
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 05.06.2005, 07:55 Titel: |
|
|
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. |
??? 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
Gruß DirectXer
Zuletzt bearbeitet von DirectXer am 05.06.2005, 07:58, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 05.06.2005, 08:54 Titel: |
|
|
@ DirectXer
Nö, funzt bei negativen doch genauso.
Dafür sind ja die If-Abfragen da.
In dein Konzept passt keine der beiden Methoden?
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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 05.06.2005, 09:31 Titel: |
|
|
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 |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 05.06.2005, 10:41 Titel: |
|
|
@ Patrick:
Dein Quelltext funzt nur mit Stellen größer 1, aber nicht mit 1 selbst.
Sonst wird dort genauso falsch gerundet. _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
|
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 05.06.2005, 11:13 Titel: |
|
|
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
Gruß DirectXer
Zuletzt bearbeitet von DirectXer am 05.06.2005, 11:17, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
|
|
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
|