Zitat:
|
sorry für OT, aber: hat damit schon jemand Erfahrung gemacht?
|
Nein, aber HipHop wird dieses Problem auch nicht lösen können, bzw. den PHP-Ansatz wesentlich schneller machen, weil der byteweise Zugriff in einer Schleife auch in "hochoptimiertem" Doppeltplus-C nicht besonders schnell ist.
Zitat:
Zitat von hman13 Hallo,
um auch mit größeren Zahlen rechnen zu können, habe ich ein paar Funktionen geschrieben: PHP-Code: function get($in,$pos){
$out=substr($in, -$pos, 1);
return intval($out);
}
//addieren
function add($a,$b){
$c="";
$u=0;
$max[0]=strlen($a);
$max[1]=strlen($b);
$max=max($max);
for($i=1;$i<=$max;$i++){
$d=get($a,$i)+get($b,$i)+$u;
$u=0;
if($d>9){$d=$d-10;$u=1;}
$c=$d.$c;
}
if($u){$c=$u.$c;}
return $c;
}
//multipliziert a mit b, durch b* addieren von a
function mul2($a,$b){
$c="";
for($i=1;$i<=$b;$i++){
$c=add($c,$a);
}
return $c;
}
//multipliziert a mit b
function mul($a,$b){
$c="";
for($i=strlen($b);$i>=1;$i--){
$e="";
for($j=0;$j<($i-1);$j++){$e=$e."0";}
$d=mul2($a,get($b,$i)).$e;
$c=add($d,$c);
}
return $c;
}
Diese Funktionen sind leider etwas langsam. Deswegen wollte ich von euch wissen, ob man da etwas optimieren kann. |
Anstatt jede Ziffer einzeln zu addieren oder zu subtrahieren, kannst du auch mehrere Stellen gemeinsam berechnen. 32-bittiges PHP kann mit Ganzzahlen im Dezimalbereich bis bis zu plus/minus einer Milliarde umgehen. Mit Floats könntest du sogar bis +/-1_000_000_000_000_000 (== eine Billiarde, nächstkleinere Zehnerpotenz vor 2 hoch 51) rechnen. Überträge sind mit einberechnet, führen also nicht zu einem Zahlenüberlauf.
Bei der Multiplikation wird es schwieriger. Aber auch hier könnte man etwas konstruieren, was wahrscheinlich schneller läuft als dein Ansatz. Der Trick besteht wieder im Zerlegen, diesmal der Faktoren:
(a + b)
x (c + d) = ac + ad + bc + bd
Da die Produkte ac, ad usw. wiederum nicht die in PHP maximal mögliche Ganz- oder Real-Zahl überschreiten dürfen, sind hier die Stellenanzahlen begrenzt (stärker als bei der Addition):
Integer (Ganzzahlen): 10_000 (< 65536)
Real (Gleitkommazahlen): 10_000_000 (< 2 hoch 25)
Du könntest dir die Teilbereiche mit substr() ausschneiden, mit intval()|floatval() oder durch explizites Casting mit (int) oder (float) in Ganz- oder Realzahlen umwandeln und mit diesen Werten dann die Teilberechnungen durchführen. Die Ergebnisse der Teilberechnungen (Überträge nicht vergessen) müssen dann wieder in Strings umgewandelt werden, um sie am Ende wieder zusammenkleben zu können.