[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2004
    Beiträge
    327

    größte Zahl für interne Berechnung im RPG

    Hallo Zusammen,
    diese Formel bricht ab:
    for w@Idx = w@Start to Pi@K;
    monitor;
    Po@Poisson += ((Pi@Lambda ** w@Idx) *
    (c@Eulner ** (Pi@Lambda * -1)) )
    / factorial(w@Idx);
    on-error *all;
    Po@Poisson = -1;
    leave;
    endmon;
    endfor;

    Es liegt an der Berechnung Pi@Lambda ** w@idx. Index 49 klappt noch, Index 50 geht schief.
    Pi@Lambda = 35, sprich 35^50. Ist natürlich eine gigantisch große Zahl.

    In der Formel geht es um den Poisson Wert kumliert, sprich Excel Formel POISSON.VERT.
    Siehe auch: https://www.ibm.com/docs/de/i/7.3?topic=types-numbers

    Es geht wohl max 10^63+1, aber das wäre ja schon kleiner als 35^50 und müsste somit viel früher abbrechen. Zusätzlich steht aber auch noch, dass es den Typ decimal floating point gibt, der wohl 10^6144 kann.
    Wie bekomme ich das gelöst?

    Danke.
    Klaus

  2. #2
    Registriert seit
    Sep 2004
    Beiträge
    327

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Zu bedenken ist einfach, dass DecFloat nur 16 oder 34 stellige Genauigkeit hat.
    Somit wird die Potenz im Ergebnis immer ungenauer und ob das akzeptabel ist....
    Aber Excel kann ja nur Double und das ist max. 17-Stellig * 10^+/-308.
    Somit kannst du in ILERPG auch Float(8) nehmen, um mit Excel gleich zu ziehen.

    Excel Potenz(35;50):
    15973578394645000000000000000000000000000000000000 0000000000000000000000000000,00

    Calc.exe (kann wohlDecFloat)
    1,5973578394644968506635155063919e+77
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von itec01 Beitrag anzeigen
    Hallo Zusammen,
    diese Formel bricht ab:
    for w@Idx = w@Start to Pi@K;
    monitor;
    Po@Poisson += ((Pi@Lambda ** w@Idx) *
    (c@Eulner ** (Pi@Lambda * -1)) )
    / factorial(w@Idx);
    on-error *all;
    Po@Poisson = -1;
    leave;
    endmon;
    endfor;

    Es liegt an der Berechnung Pi@Lambda ** w@idx. Index 49 klappt noch, Index 50 geht schief.
    Pi@Lambda = 35, sprich 35^50. Ist natürlich eine gigantisch große Zahl.

    In der Formel geht es um den Poisson Wert kumliert, sprich Excel Formel POISSON.VERT.
    Siehe auch: https://www.ibm.com/docs/de/i/7.3?topic=types-numbers

    Es geht wohl max 10^63+1, aber das wäre ja schon kleiner als 35^50 und müsste somit viel früher abbrechen. Zusätzlich steht aber auch noch, dass es den Typ decimal floating point gibt, der wohl 10^6144 kann.
    Wie bekomme ich das gelöst?

    Danke.
    Klaus
    ... das gesuchte Ergebnis liegt per definitionem zwischen 0 und 1. Das Problem mit der Formel ist, dass was sehr großes durch was ziemlich großes dividiert wird und mit was sehr kleinem multipliziert wird.
    Wenn du das mit float Arithmetrik machst, verlierst du dabei Genauigkeit.
    Sowas berechnet man rekursiv, dann tritt das numeric overflow Problem später auf. Wenn das immer noch nicht reicht, dann gibt es noch die Stirling-Formel. Frag mal Marjorie nach Poisson Verteilung - da gibt es einen Wikipedia Artkel.
    Wo ich gerade dabei bin: gewöhn dir mal den Klammeraffen in den Namen ab, der macht Probleme, weil der bei verschiedenen CCSIDs nicht immer an derselben Stelle sitzt.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Solange bei der Umwandlung die CCSID passt, kann man @ und # verwenden. Beim Transport der Quelle auf ein anderes System kann es da schon mal Probleme geben.
    Man erinnere sich nur an die Lib #LIBRARY, die nur in einer Jobumgebung passend zur Systemsprache (Language, nicht CCSID) passt und ansonsten als ungültiger Name abgelehnt wird.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Bei der Berechung kann man auch den Umweg via Log10-Berechungen machen.
    Schließlich sind Multiplikation/Division und Potenzrechnung mit LOG10 einfacher, da die Werte kleiner sind und bei 63-stelliger Genauigkeit wahrscheinlich auch performanter.
    Ein packed(63:55) entspricht da schon einem 10 hoch 10.000.000!
    Auch die Fakultät kannst du letztendlich mit Addition von LOG10 berechnen.
    Somit hast du nur noch das Endergebnis mit 10 ** (Log10-Ergebnis) auszuwerten.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. iseries Sicherheittool interne Userkontrolle
    By svente in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 03-11-14, 12:46
  2. Antworten: 0
    Letzter Beitrag: 10-11-09, 10:17
  3. select 10 größte Werte je Ordnungsbegriff
    By holly in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 16-05-06, 12:45
  4. 10stellige Integer -Zahl im RPG
    By Juergen in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 23-04-05, 13:05
  5. mit SQL nur 100 größte Sätze lesen
    By holly in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 31-01-03, 09:08

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •