GMP ile ilgili birşeyler vardı (tam hatırlamıyorum) ...
kurmamıştım ama onunla olabiliyor diye hatırlıyorum bi araştır istersen...
Bu aşagıdaki class ile büyük sayıları toplayıp çıkarabilirsin, belki az da olsa işini görür...
class BigToplam {
private $numbers = array();
private $afterPoint = array();
private $afterPointLength = 0;
private $result = 0;
public function __construct() { }
public function addNumber ($number) {
$this->numbers[] = (string)$number;
}
private function doAdd ($n1, $n2) {
if ($n1 == 0) return $n2;
if ($n2 == 0) return $n1;
if (strlen($n1) <=13 && strlen($n2) <= 13) {
return (string)$n1+$n2;
}
$finalNumber = array();
$c = 0;
$n1 = (string)$n1;
$n2 = (string)$n2;
$m = max(strlen($n1), strlen($n2));
$n1 = str_pad($n1, $m, " ", STR_PAD_LEFT);
$n2 = str_pad($n2, $m, " ", STR_PAD_LEFT);
$numbers1 = chunk_split($n1, 13, ";");
$numbers1 = substr($numbers1, 0, -1);
$numbers1 = explode(";", $numbers1);
$numbers1 = array_reverse($numbers1);
$numbers2 = chunk_split($n2, 13, ";");
$numbers2 = substr($numbers2, 0, -1);
$numbers2 = explode(";", $numbers2);
$numbers2 = array_reverse($numbers2);
$maxSize = max(count($numbers1), count($numbers2));
for ($i=0;$i<$maxSize;$i++) {
$totalZeros = 0;
$totalZeros1 = 0;
$totalZeros2 = 0;
for ($j=0;$j<strlen($numbers1[$i]);$j++) {
if ($numbers1[$i][$j] == 0) {
$totalZeros1++;
} else {
break;
}
}
for ($j=0;$j<strlen($numbers1[$i]);$j++) {
if ($numbers2[$i][$j] == 0) {
$totalZeros2++;
} else {
break;
}
}
$totalZeros = max($totalZeros1, $totalZeros2);
$partialResult = (string)($numbers1[$i] + $numbers2[$i] + $c);
$partialResult = str_pad($partialResult, strlen($partialResult)+$totalZeros, "0", STR_PAD_LEFT);
if (strlen($partialResult) > max(strlen($numbers1[$i]),strlen($numbers2[$i]))) {
$partialResult = (string)$partialResult;
$c = $partialResult[0];
$finalNumber[] = substr($partialResult, 1);
} else {
$c=0;
$finalNumber[] = $partialResult;
}
}
$finalNumber = array_reverse($finalNumber);
$finalNumber = implode("", $finalNumber);
if ($c != 0) $finalNumber = $c.$finalNumber;
return $finalNumber;
}
public function calc () {
for ($i=0; $i<count($this->numbers);$i++) {
$n = explode(".", $this->numbers[$i]);
if (count($n) == 1) {
$this->result = $this->doAdd($this->result, $this->numbers[$i]);
} elseif (count($n) == 2) {
$this->afterPoint[] = $n[1];
$this->afterPointLength = max($this->afterPointLength, strlen($n[1]));
$this->result = $this->doAdd($this->result, $n[0]);
} else {
trigger_error("<b>".$this->numbers[$i]."</b> is invalid !!", E_USER_ERROR);
}
}
if ($this->afterPointLength > 0) {
$r = 0;
foreach ($this->afterPoint as $number) {
$number = str_pad($number, $this->afterPointLength, "0", STR_PAD_RIGHT);
$r = $this->doAdd($r, $number);
}
if (strlen($r) > $this->afterPointLength) {
$this->result = $this->doAdd($this->result, substr($r, 0, -$this->afterPointLength));
if (strrpos($r, "0") != strlen($r)-1)
$this->result = $this->result.".".substr($r, 1);
} else {
$this->result = $this->result.".".$r;
}
}
return $this->result;
}
}
//kullanimi
$calc = new BigToplam();
$sayi = "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
$calc->addNumber($sayi);
$calc->addNumber($sayi);
$sonuc = $calc->calc();
echo $sonuc;
print "Sonuc ".strlen($sonuc)." basamaklidir. ";
//$calc->addNumber($sayi1);
//$calc->addNumber($sayi2);
//$calc->addNumber($sayi3);
//$calc->addNumber($sayi4);
//$sonuc = $calc->calc();çıktısı
200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Sonuc 426 basamaklidir.
phpclasses daki classları inceledin mi bilmiyorum ama,
belki aralarında vardır çarpma/bölme işlemini yapan vardır.
big number calculations php
kolay gelsin...
çarpma / bölme olayını aşarsan eğer , kodları paylaşırsan sevinirim. ....