gesättigte Arithmetik

Gast #2472339
Lesenswert?
• ▲
▼
Hallo

ich möchte ein Programm schreiben, dass alle  vier Grundrechenarten 
unterstützt. Das habe ich bereits geschafft.
Jetzt fehlt mir nur noch der Zusatz mit der gesättigten Arithmetik.
Es soll bei einer Wertebereichsüberschreitungen das Ergebnis auf die 
nächstliegende Wertebereichsgrenze gesetzt werden.
Sehe ich das richtig, dass wenn ich ein Ergebnis habe, welches den 
Wertebereich einer 16 Bit unsigned Zahl um 1 überschreitet, dann -32768 
herauskommen muss?!?!?
Persönliche Seite #2472343
Lesenswert?
• ▲
▼
Studi schrieb:
> Sehe ich das richtig, dass wenn ich ein Ergebnis habe, welches den
> Wertebereich einer 16 Bit unsigned Zahl um 1 überschreitet, dann -32768
> herauskommen muss?

Nein. Wenn die Zahl kein Vorzeichen hat, hat sie kein Vorzeichen. 
Vermutlich hast Du signed gemeint, dann hättest Du recht.
1
int i;
2

3
i = 0x7fff;
4

5
printf("%d\n", i);
6

7
i++;
8

9
printf("%d\n", i);
Gast #2473398
Lesenswert?
• ▲
▼
Hm das war nicht richtig!

signed integer hat einen Zahlenwert von -32768 bis 32767. Wenn ich nun 
32767 + 1 rechne, soll 32767 als Ergebnis heraus kommen, da dies näher 
an dem richtigen Ergebnis dran ist als die -32768.
Nur wie mache ich das?
#2473409
Lesenswert?
• ▲
▼
Es gibt doch im großen Netz etliche Texte, wie man so etwas realisiert.
Ich habe es nie genutzt (und wenn, dann würde ich es nicht in C, sondern 
C++ machen).

Auf jeden Fall muß man VOR jeder Operation schauen, ob es noch passt, 
z.B. indem man vor einer Addition einen Summanden vom größtmöglichen 
Ergebnis abzieht und mit dem anderen vergleicht.
Das Ganze natürlich abhängig von den Vorzeichen der Operanden...

So richtig effizient wird das nicht werden, und in C auch nicht schön zu 
schreiben, weil man i+j nicht auf die eigenen Operationen umbiegen kann, 
sondern sowas wie add_signed_int_saturated( i, j ) schreiben müsste.
Gast #2473415
Lesenswert?
• ▲
▼
Mein Problem nochmal:

Ich muss ein Programm schreiben, welches bei einer 
Wertebereichsüberschreitung, den höchsten Wert des Wertebereichs angibt. 
Ich muss 16 Bit Integer verwenden.

Mein h-file ist oben.
Angehängte Dateien:
#2473423
Lesenswert?
• ▲
▼
Da signed Arithmetik bei dir offenbar zu einem Überlauf führt:

Wie wäre es einfach mal die Ergebnisse zu vergleichen?

Wenn du zu einer Zahl X etwas postives Y dazuzählst, dann muss das 
Ergebnis offensichtlich größer als X sein. Kommt bei deiner Rechnung 
etwas kleineres raus (zb +32768 + 1 -> -32767, -32767 ist kleiner als 
+32768), dann gab es ziemlich offensichtlich einen Überlauf.

Reicht dir das als Hinweis?

Man kann sich aber zb auch voerher ausrechnen, wieviel man zu einer Zahl 
X noch maximal dazuaddieren kann, bis man am größtmöglichen Wert ist. 
Wenn dann die Zahl Y größer als dieser errechnete Maximalwert ist, dann 
wird die Addition wohl in die Hose gehen.



Es ist nicht verboten, zwischen Zahlen nach Zusammenhängen zu suchen und 
sich selbst ein paar Zusammenhänge durch Probieren und Überlegen zu 
erschliessen. Dann kann man das Ganze auch programmieren. Aber 
irgendwann wird es Zeit, auf eigenen Beinen zu stehen und die Sicherheit 
von vorgekauten Patentrezepten zu verlassen.
Persönliche Seite #2474000
Lesenswert?
• ▲
▼
Karl Heinz Buchegger schrieb:

> Wie wäre es einfach mal die Ergebnisse zu vergleichen?
>
> Wenn du zu einer Zahl X etwas postives Y dazuzählst, dann muss das
> Ergebnis offensichtlich größer als X sein. Kommt bei deiner Rechnung
> etwas kleineres raus (zb +32768 + 1 -> -32767, -32767 ist kleiner als
> +32768), dann gab es ziemlich offensichtlich einen Überlauf.
>
> Reicht dir das als Hinweis?

Nein, denn in C ist Signed-Ünberlauf undefined, so daß diese 
Vorgehensweise nicht C-konform ist.

GCC kennt die Option -fno-strict-overflow, welche aber nicht portabel 
ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren