Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Sum() - Unbegrenzt lange Ganzzahlen addieren


  • Please log in to reply
19 replies to this topic
Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Vielleicht ist es also doch keine so gute Idee ^^

 

Das kommt immer auf den Kontext an.

Selbst in diesem Falle, beim Beibehalten der alten Struktur (stellenweise addition mit übertrag) und bei der Durchführen der Berechnungen über MCode, ist das Script beim Berechnen von 2 hoch 10000 ca. 0,5 Sekunden schneller.

Wenn man es jetzt machen würde, wie nnnick es vorgeschlagen hat, wäre das Script wahrscheinlich unglaublich schnell, weil dann pro Rechenschritt nicht nur eine Stelle des Strings, sondern gleich ein ganzer 32 Bit Datensatz verarbeitet wird.

 

Leider kann ich das noch nicht realisieren, da fehlt mir das Wissen...


Find the recent autohotkey version here: ahkscript.org


just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Es würde wohl schon reichen, wenn Du die Schleife zur Abarbeitung der einzelen Stellen innerhalb des MCODE realisieren würdest. (Ich kann C leider gerade so lesen, aber nicht schreiben!)

 

Man kann aber auch ohne MCODE einige Beschleunigung rausholen, wenn man berücksichtigt, dass AHK bis zu 18 Stellen lange Integerwerte risikofrei addieren kann:

Sum(Int1, Int2) { ; Summe zweier Integerstrings bilden
   Static ML := 18                  ; maximale Länge, bis zu 18 Dezimalstellen können mit AHK normal addiert werden
   Static MV := 999999999999999999  ; maximaler Wert ohne Überlauf
   Static ZZ := "00000000000000000" ; Nullen zum Auffüllen
   L1 := StrLen(Int1), L2 := StrLen(Int2)
   If (L1 <= ML) && (L2 <= ML)
      Return (Int1 + Int2)
   While (L1 < L2)
      Int1 := "0" . Int1, L1++
   While (L2 < L1)
      Int2 := "0" . Int2, L2++
   VarSetCapacity(Summe, (L1 + 1) << !!A_IsUnicode, UB := 0)
   While (L1 >= ML) {
      L1 -= ML
      Sum16 := SubStr(Int1, L1 + 1, ML) + SubStr(Int2, L1 + 1, ML) + UB
      Summe := SubStr(ZZ . SubStr(Sum16, (UB := Sum16 > MV ? 1 : 0) + 1), 1 - ML) . Summe
   }
   If (L1 > 0)
      Return ((Substr(Int1, 1, L1) + SubStr(Int2, 1, L1) + UB) . Summe)
   Else If (UB)
      Return (UB . Summe)
   Return Summe
}

Prefer ahkscript.org for the time being.


Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Wow.

Respekt, das ist ziemlich flott! happy.png

 

Edit:

Vorallem die Art, wie der kleinere Wert mit Nullen gefüllt wird, gefällt mir:

   While (L1 < L2)
      Int1 := "0" . Int1, L1++

Find the recent autohotkey version here: ahkscript.org


nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Versuch mal...
 

/*
int stringlen(char *str)
{
  int i=0;
  for (; str[i]!=0; i++);
  return i;
}
*/
stringlen := MCode("2,x86:i0wkBDPAOAF0B0CAPAgAdfnD,x64:M8A4AXQKSP/B/8CAOQB19vPD")
MsgBox, % DllCall(stringlen, "astr", "test")
...das funktioniert bei mir.
 
Allerdings ist ein DllCall meistens langsamer, als direkt mit AHK zu berechnen oder AHK-Funktionen zu verwenden.
In diesem Fall würde ich auf jeden Fall StrLen, und keinen MCode empfehlen.

 
Vielleicht ist es also doch keine so gute Idee ^^

Ein DLLCall ist natürlich Langsamer als eine interne AHK Funktion die genau diesen Zweck erfüllt (in diesem Fall besonders da AHK sich die Stringlänge merkt anstatt sie zu Berechnen.)
Allerdings ist AHK bei Berechnungen langsam.
C++ ist da um einiges flotter
Generell gilt destso mehr Code eine Funktion enthält destso schneller ist sie in C++.
Hier sind wir schon an einem Punkt angelangt wo es sich schon lohnt.

Visit the new forum ahkscript.org.

http://ahkscript.org


Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Mist...

 

Ich wollte nun eigentlich die Funktion von just me nach C++ übersetzen, deshalb habe ich gerade versucht, folgenden Code mit Bentschi's Online Generator zu kompilieren (Optionen: "Optimize for speed", "x86 and x64", "HEX"), eigentlich nur um mal zu testen ob es auch keine Probleme mit dem String-In/Output gibt:

#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

string test(string input)
{
    return input;
}

Sollte eigentlich keine Probleme machen, oder? :D

Blöd ist nur, dass er jetzt die gesamten String Funktionen mit ausgibt:

Spoiler

 

Hier der Compile Log:

Spoiler

 

AHK scheint damit nicht klarzukommen, denn wenn ich die Funktion über

MsgBox % DllCall(test, "ASTR", "Hello World!")

aufrufe, bleibt die MessageBox leer. sad.png


Find the recent autohotkey version here: ahkscript.org