Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 38

Thema: 64/32 Bit Division in AWL

  1. #1
    Registriert seit
    28.05.2009
    Beiträge
    18
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo ihr,

    ich sitze gerade über einem S7-Programm (in AWL) und komme bei der Division nicht weiter:

    Durch eine 32x32 Bit Multiplikation erhalte ich ein 64Bit Ergebnis, bestehend aus einem Low und einen High-Teil mit jeweils 32 Bit.
    Dieses Ergebnis muss ich nun durch eine 32Bit Zahl dividieren.

    Wie gehe ich bei der Division vor, der 64Bit große Dividend passt ja nicht in den 32 Bit Akku?

    Könnt ihr mir da weiterhelfen?
    Zitieren Zitieren 64/32 Bit Division in AWL  

  2. #2
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Das Ergebnis ist immer noch eine 32 Bit Zahl. Wenn das Ergebnis zu groß wird, bekommst Du das über ein bestimmtes Statusbit zurückgemeldet.

  3. #3
    Lisa ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.05.2009
    Beiträge
    18
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ja, das ist mir klar, aber nicht wie ich auf dieses 32 Bit Ergebnis komme.
    Mein Problem ist die Division selbst.

    Ich habe zuerst 2^31 geladen (da der Hi-Teil ja eigentlich 32 Stellen weiter links steht) und dies dann durch den Divisor geteilt (den Divisor habe ich vorher noch um 1 Stelle nach rechts geschoben, da der Hi-Teil ja 32 Stellen weiter links steht, und ich ja max 2^31 -1 laden kann). Anschließend habe ich den Low-Teil durch den Divisor geteilt und dann die Ergebnisse addiert.
    So komme ich aber leider nur mit großer Abweichung an das richtige Ergebnis heran.

    Wie kann ich die Division besser aufbauen, dass ich auch das richtige Ergebnis rausbekomme?

  4. #4
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    ?
    Also erstmal der Reihe nach. Ich denke mal, Du sprichst von einer Ganzzahldivision?

    Dann wäre der Ablauf z.B. folgender:

    Teilung von 6.000.000 durch 1.500.000

    L L#6000000
    L L#1500000
    /D -> hier steht jetzt im Akku 1 Dein Ergebnis
    = MDxyz

    In xyz stünde dann eine 4. Mehr nicht.

  5. #5
    Lisa ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.05.2009
    Beiträge
    18
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Sorry, hab vergessen zu schreiben, dass es sich um eine Ganzzahldivision handelt.

    Aber mein Dividend ist 64Bit groß, d.h. ich kann ihn nicht so laden wie in Deinem Beispiel die 6.000.000.
    Ich habe also den Dividenden in zwei 32 Bit Zahlen unterteilt (High und Low- Teil)
    Den Divisor kann ich ohne Probleme in den Akku laden.
    Allerdings weiß ich jetzt nicht, wie ich mit dem unterteilten Dividenden rechnen soll.
    Lade ich erst den High-Teil, teile diesen dann durch den Divisor und lade dann den Low-Teil und teile diesen ebenfalls durch den Divisor?
    Oder wie muss ich da vorgehen?

  6. #6
    Registriert seit
    01.10.2007
    Ort
    Waiblingen
    Beiträge
    3.317
    Danke
    767
    Erhielt 536 Danke für 419 Beiträge

    Standard

    Also, wenn ich recht verstanden habe, zweifelte Grubba ja an, dass Du einen Divident mit 64 Bit vorliegen hast. Ich gehe mal davon aus, dass Du die Multiplikation derart durchgeführt hast, dass Du die zwei 32-Bit-Zahlen zunächst von ihren Vorzeichen befreit hast, dann in jeweils zwei 16-Bit-Zahlen zerlegt hast und dann entsprechend vier mal multipliziert.
    Code:
    z=x*y
    x=65536a+b
    y=65536c+d
    z=(65536a+b)(65536c+d)
     =65536*65536ac+65536bc+65536ad+bd
    habe ich das mal soweit richtig erfasst?

    Bei Deiner Beschreibung der Division vermisse ich, wie Du mit dem Divisionsrest der ersten Division verfahren bist ...

  7. Folgender Benutzer sagt Danke zu Perfektionist für den nützlichen Beitrag:

    Lisa (28.05.2009)

  8. #7
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard

    Aha.

    Das wird so ohne weiteres nicht so einfach machbar sein. Allerdings gibts da die freie Oscat-Bibliothek, in der auch Funktionen für 64Bit-Arithmetik enthalten sind. Hab ich aber noch nie benötigt.

    Wenn Dein Dividend nicht aus irgendeiner direkten Eingabe oder Konstanten entspringt, könntest Du Deinen Dividenden vorher künstlich "kleinhalten"

    Also statt erst 5.000.000*5.000.000 und dann durch x
    zuerst 5.000.000 durch x und dann wieder *5.000.000.

  9. Folgender Benutzer sagt Danke zu Grubba für den nützlichen Beitrag:

    Lisa (28.05.2009)

  10. #8
    Lisa ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.05.2009
    Beiträge
    18
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ja, meine Multiplikation sieht genau so aus.
    Da bekomm ich sogar richtige Ergebnisse raus.

    Den Divisionsrest habe ich im 1. Versuch vernachlässigt, im 2. Versuch hab ich dann den Rest der Division (von High-Teil durch Divisor) zum Low-Teil des Dividenden dazuaddiert und dieses Ergebnis dann erst durch den Divisor geteilt.

  11. #9
    Lisa ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    28.05.2009
    Beiträge
    18
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Leider funktioniert das mit dem künstlich kleinhalten nicht.
    Zumindest weiß ich nicht wie.
    Wenn ich nämlich zuerst dividiere und dann erst multipliziere, bekomme ich bei der Ganzzahldivision nur 0 oder 1 raus (1 auch nur wenn der Anwender den oberen Grenzwert eingibt, sonst immer nur 0).
    Da ich leider nur Ganzzahldivision verwenden kann, würde ich dann fast immer mit 0 multiplizieren.

  12. #10
    Registriert seit
    12.02.2008
    Ort
    Westfalen (Dort wo's Schwarzbrot gibt)
    Beiträge
    417
    Danke
    8
    Erhielt 87 Danke für 72 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Kannst Du die Festpunktwerte in Fließkommawerte wandeln, dann dividieren/multiplizieren und dann im Bedarfsfall runden und wieder in Festpunkt zurückzuwandeln?

Ähnliche Themen

  1. SCL Division mit Rest
    Von vollmi im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 05.06.2009, 15:41
  2. Division von INT Zahlen
    Von HonestAnnie im Forum Simatic
    Antworten: 58
    Letzter Beitrag: 16.07.2008, 23:31
  3. Division von DInt
    Von godi im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 07.01.2006, 08:10
  4. Genauest mögliche Division zweier Zahlen
    Von Anonymous im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 16.04.2005, 09:53
  5. Division durch null
    Von kpeter im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 08.02.2005, 18:48

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •