Integerarithmetik



  • Hallo und guten morgen,

    ich stehe wahrscheinlich etwas auf dem Schlauch... Wenn ich folgendes Programm ausführe:

    #include <stdio.h>
    
    int main () {
      long int Entry1=30000;
      long int Entry2=100000;
      long int Result;
    //
      Result = Entry1 + Entry2;
      printf (" 1. %li + %li = %li\n", Entry1, Entry2, Result);
      Result = Entry1 - Entry2;
      printf (" 2. %li - %li = %li\n", Entry1, Entry2, Result);
      Result = Entry1 * Entry2;
      printf (" 3. %li * %li = %li\n", Entry1, Entry2, Result);
      Result = Entry1 / Entry2;
      printf (" 4. %li / %li = %li\n", Entry1, Entry2, Result);
      Result = Entry1 % Entry2;
      printf (" 5. %li modulo %li = %li\n", Entry1, Entry2, Result); 
      return 0;
    }
    

    ergibt das:

    1. 30000 + 100000 = 130000
    2. 30000 - 100000 = -70000
    3. 30000 * 100000 = -1294967296
    4. 30000 / 100000 = 0
    5. 30000 modulo 100000 = 30000

    Jetzt meine Fragen:
    1. Wie kann ich im Fall 3 den Überlauf feststellen?
    2. Kann ich im Int-Format auch Nachkommastellen erhalten (Fall 4)?

    Ich denke, ein kleiner Hinweis reicht schon...

    Besten Dank im voraus!



  • 1. Die Tatsache, daß du dort einen negativen Wert herausbekommst, sollte schon ein Indiz für einen Überlauf sein. Ansonsten mußt du vor der Rechnung testen, ob das Ergebnis in einen long passen kann.

    2. Wie du gesehen hast: nein. Ganze Zahlen haben schon per Definition keine Nachkommastellen, die werden bei der Division weggelassen (dafür gibt es den Modulo-Operator).



  • CStoll schrieb:

    1. Die Tatsache, daß du dort einen negativen Wert herausbekommst, sollte schon ein Indiz für einen Überlauf sein. Ansonsten mußt du vor der Rechnung testen, ob das Ergebnis in einen long passen kann.

    Wenn ich mit einer negativen Zahl multiplitiere wird die auch negativ... wie prüfe ich das also??

    CStoll schrieb:

    2. Wie du gesehen hast: nein. Ganze Zahlen haben schon per Definition keine Nachkommastellen, die werden bei der Division weggelassen (dafür gibt es den Modulo-Operator).

    Der Modulooperator gibt im obigen Beispiel "3000"... Das ist wenig hilfreich.

    Wenn man kaufmännische Dinge berrechnen, möchte sind float eher ungenau, das weiss jeder - wo aber finde ich eine solide Anleitungen für Integerarithmetik??

    Auf Prozessorebene gibt es ja das Overflow oder Carry Flag um das abzufangen - oder? Wie mache ich das in C??



  • integer1 schrieb:

    CStoll schrieb:

    1. Die Tatsache, daß du dort einen negativen Wert herausbekommst, sollte schon ein Indiz für einen Überlauf sein. Ansonsten mußt du vor der Rechnung testen, ob das Ergebnis in einen long passen kann.

    Wenn ich mit einer negativen Zahl multiplitiere wird die auch negativ... wie prüfe ich das also??

    Sagen wir es mal so: Wenn das Vorzeichen des Ergebnisses nicht den Erwartungen entspricht, kannst du dir schonmal ziemlich sicher sein, daß du einen Überlauf ausgelöst hast. Leider kann die Multiplikation auch so weit überlaufen, daß du doch wieder das richtige Vorzeichen herausbekommst. Zur sicheren Überprüfung von Überläufen fällt mir atm nur eins ein: if(INT_MAX/b<a) printf("Werte zu groß"); (für negative Zahlen mußt du eine Sonderbehandlung machen)

    CStoll schrieb:

    2. Wie du gesehen hast: nein. Ganze Zahlen haben schon per Definition keine Nachkommastellen, die werden bei der Division weggelassen (dafür gibt es den Modulo-Operator).

    Der Modulooperator gibt im obigen Beispiel "3000"... Das ist wenig hilfreich.

    Modulo liefert dir den Rest bei der Division. Was du dann mit diesem Wissen machst, ist deine Sache.

    Wenn man kaufmännische Dinge berrechnen, möchte sind float eher ungenau, das weiss jeder - wo aber finde ich eine solide Anleitungen für Integerarithmetik??

    In kaufmännischen Aufgaben rechnet man je nach erforderlicher Genauigkeit entweder mit double oder mit int (im letzteren Fall aber nicht in Euro, sondern in Cent).

    Auf Prozessorebene gibt es ja das Overflow oder Carry Flag um das abzufangen - oder? Wie mache ich das in C??

    AFAIK kapselt C diese Details, aber wenn du gar keine andere Lösung weißt, hilft eventuell der Inline-Assembler.



  • Integer1 schrieb:

    1. Wie kann ich im Fall 3 den Überlauf feststellen?
    2. Kann ich im Int-Format auch Nachkommastellen erhalten (Fall 4)?

    1. Vorbeugen ist besser als feststellen: Nimm long long
    2. Rechne mal 100, dann hast du schonmal 2 Nachkommastellen.



  • Integritario schrieb:

    1. Vorbeugen ist besser als feststellen: Nimm long long
    2. Rechne mal 100, dann hast du schonmal 2 Nachkommastellen.

    Richtig, mit long long kann ich natürlich den Wertebereich erhöhen - aber das ist ja nicht die Lösung. Und das mit dem x100 habe ich eben auch schon mal gelesen, weiss aber nicht mehr wo 😕
    Weiss wirklich keiner einen Link zu einer saubereb Anleitung für Integerarithmetik?? Googeln hilft hier irgendwie nicht weiter....
    Besten Dank!



  • Das Stichwort heißt Festkommaarithmetik.

    Oder bei Finanzen/Währung alles in Cent/Pence/Øre/... rechnen und nur bei der Ausgabe wandeln.


Log in to reply