🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#1886
Author: Joerg Bornemann
Date: Sat, 23 Mar 1996 21:17
19 lines
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
#1889
Author: Ullrich von Bassewitz
Date: Sun, 24 Mar 1996 11:45
25 lines
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
#1928
Author: Joerg Bornemann
Date: Mon, 25 Mar 1996 13:37
65 lines
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
#1947
Author: Karl-Heinz Krause
Date: Thu, 28 Mar 1996 18:09
45 lines
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