Thread View: de.comp.lang.c++
4 messages
4 total messages
Started by Joerg Bornemann
Sat, 23 Mar 1996 21:17
wrap around abfragen/verhindern
Author: Joerg Bornemann
Date: Sat, 23 Mar 1996 21:17
Date: Sat, 23 Mar 1996 21:17
19 lines
539 bytes
539 bytes
Hallo!
Wie kann ich den wrap around von Variablen
vom Typ int in einer Schleife am besten abfragen?
Also...
int i,a;
for (i = 1; i < 200; i++)
{
a = i*i*i;
if wrap_around(a)
continue;
}
cu Joerg
--
E-Mail: juri@compi.baltic.de
Re: wrap around abfragen/verhindern
Author: Ullrich von Bassewitz
Date: Sun, 24 Mar 1996 11:45
Date: Sun, 24 Mar 1996 11:45
25 lines
1297 bytes
1297 bytes
Joerg Bornemann (juri@compi.baltic.de) wrote:
> Wie kann ich den wrap around von Variablen
> vom Typ int in einer Schleife am besten abfragen?
In sowas ist C nicht besonders gut. Das ist eines der wenigen Probleme, das
sich mit erheblich weniger Aufwand in Assembler als in C loesen laesst.
Eine Moeglichkeit ist das Ausweichen auf einen Datentyp, der einen
groesseren Wertebereich darstellen kann (long oder double) und Vergleich
des Ergebnisses.
Wenn es sich nur um eine bestimmte Operation handelt (z.B. nur Addition),
dann lassen sich auch Spezial-Loesungen finden, die setzen aber einen Test
vor der Operation voraus, weil die Addition im Falle eines Ueberlaufs
Information verliert.
Es kommt also ein bischen drauf an, was Du ueberhaupt vorhast...
Gruss
Uz
--
Ullrich von Bassewitz uz@ibb.schwaben.com
Re: wrap around abfragen/verhindern
Author: Joerg Bornemann
Date: Mon, 25 Mar 1996 13:37
Date: Mon, 25 Mar 1996 13:37
65 lines
2902 bytes
2902 bytes
uz@wuschel.ibb.schwaben.com wrote:
> > Wie kann ich den wrap around von Variablen
> > vom Typ int in einer Schleife am besten abfragen?
>
> In sowas ist C nicht besonders gut. Das ist eines der wenigen Probleme, das
> sich mit erheblich weniger Aufwand in Assembler als in C loesen laesst.
Mein Algo sollte also am besten so geaendert werden,
dass die Bereichsueberschreitung gar nicht auftreten kann?
BTW in meinem Programmierhandbuch habe ich dann doch noch nach langem
Suchen einen Verweis auf's Referenzhandbuch (_matherr, signal) gefunden.
Im Referenzhandbuch steht unter _matherr, genau das was ich suche.
Das Beispiel in der Onlinehilfe war aber wieder ganz toll:
/* _matherr Beispiel */
Ha ha ha. Was hab' ich gelacht. :-(
Nun kann ich leider nichts mit der knappen
Beschreibung aus dem Handbuch (Borland) anfangen...
> Eine Moeglichkeit ist das Ausweichen auf einen Datentyp, der einen
> groesseren Wertebereich darstellen kann (long oder double) und Vergleich
> des Ergebnisses.
Kommt leider nicht in Frage, da die Werte erheblich groesser werden und
ausserdem ist das Verschwendung (in meinem spez. Fall), da ich die Werte
gar nicht auswerten, sondern nur abfangen will.
> Wenn es sich nur um eine bestimmte Operation handelt (z.B. nur Addition),
> dann lassen sich auch Spezial-Loesungen finden, die setzen aber einen Test
> vor der Operation voraus, weil die Addition im Falle eines Ueberlaufs
> Information verliert.
>
> Es kommt also ein bischen drauf an, was Du ueberhaupt vorhast...
Ich will eine Funktion in ein Fenster malen, dessen Groesse variabel ist.
Hier mal 'n Programm-Ausschnitt:
wr.right hat den Wert der Fensterbreite / 2,
die erst zur Laufzeit feststeht.
1: for(i = -wr.right; i <= wr.right; i++)
2: {
3: // Es wird der Funktionswert von f(i)=i^3 berechnet
4: y = i*i*i; // Gleichung kann natuerlich auch anders lauten
5: ... Umrechnung in Fensterkoordinaten und Punkte zeichnen
6: }
In Zeile 4 erhalte ich somit in den ersten und in den letzten
Schleifendurchgaengen einen wrap around. Die letzten wrap arounds kann ich
verhindern, in dem ich negative y-Werte nach der Umrechnung in
Bildschirmkoordinaten abfrage und die Schleife per *break* beende.
Nur die ersten w.a.'s nicht.
Nun koennte ich natuerlich zwei Schleifen schreiben. Eine fuer negative i
und eine fuer positive i, aber das waere nur maessig effektiv, schlecht zu
warten und ziemlich unuebersichtlich...
cu Joerg
--
E-Mail: juri@compi.baltic.de
Re: wrap around abfragen/verhindern
Author: Karl-Heinz Krause
Date: Thu, 28 Mar 1996 18:09
Date: Thu, 28 Mar 1996 18:09
45 lines
2054 bytes
2054 bytes
Am 25. März 1996 schrieb Joerg Bornemann (juri@compi.baltic.de):
> wr.right hat den Wert der Fensterbreite / 2,
> die erst zur Laufzeit feststeht.
>
> 1: for(i = -wr.right; i <= wr.right; i++)
> 2: {
> 3: // Es wird der Funktionswert von f(i)=i^3 berechnet
> 4: y = i*i*i; // Gleichung kann natuerlich auch anders lauten
> 5: ... Umrechnung in Fensterkoordinaten und Punkte zeichnen
> 6: }
In diesem speziellen Fall würde ich zunächst einmal die Multiplikation
in long-Arithmetik durführen. Damit hat man auf jeden Fall 32 Bit und
die Multiplikation ist für abs(i) <= 1280 sicher. Also etwa
folgendermaßen:
long y;
for (i = -wr.right; i <= wr.right; i++)
{
if (abs(i) <= 1280) {
y = long(i)*i*i; // Multiplikation in long-Arithmetik!
...
}
}
> In Zeile 4 erhalte ich somit in den ersten und in den letzten
> Schleifendurchgaengen einen wrap around. Die letzten wrap arounds kann ich
> verhindern, in dem ich negative y-Werte nach der Umrechnung in
> Bildschirmkoordinaten abfrage und die Schleife per *break* beende.
> Nur die ersten w.a.'s nicht.
> Nun koennte ich natuerlich zwei Schleifen schreiben. Eine fuer negative i
> und eine fuer positive i, aber das waere nur maessig effektiv, schlecht zu
> warten und ziemlich unuebersichtlich...
> cu Joerg
> --
> E-Mail: juri@compi.baltic.de
Karl-Heinz Krause
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads