07. januar 2008 - 19:15
Der er
11 kommentarer
Hvordan fungerer division
Hvordan forstår eksempelvis en lommeregner at dividere? Hvordan fungerer operatøren i php? Jeg kunne forestille mig, at addition i php er noget alá nedenstående (dog adderer jeg jo med 1, hvor den skal kalde samme funktion som jeg er i, men det ved jeg ikke hvordan man gør). Men jeg har simpelthen ikke ingen idé om hvordan division fungerer. <?php function addition($numberX, $numberY) { $result = $numberX; for($i=1; $i<=$numberY; $i++) ++$result; return $result; } echo addition(2, 18); ?>
Annonceindlæg fra SoftwareOne
08. januar 2008 - 15:41
#5
dmdisco - jeg er godt klar over hvordan man bruger dem :) jeg vil blot, som arne_v skriver, vide HVORDAN divisionen sker.
10. januar 2008 - 04:06
#6
Kode lidt tilsvarende addition funktionen ovenfor ser ud som: function mul($a, $b) { $res = 0; for($i = 0; $i < $b; $i++) $res += $a; return $res; } function div($a, $b) { $tmp = 1; while(mul($b, $tmp+1) <= $a) $tmp++; return $tmp; } men den er hverken speciel relevant eller speciel hurtig.
10. januar 2008 - 04:07
#7
Et mere relevant og også hurtigere eksempel er: define('RADIX', 10); define('LENGTH', 4); function izero() { return str_pad("", LENGTH, "0"); } function ione() { return str_pad("", LENGTH - 1, "0") . "1"; } function ishiftl($v, $n) { return str_pad(substr($v, $n), LENGTH, "0"); } function ishiftr($v, $n) { return str_pad("", $n, "0") . substr($v, 0, LENGTH - $n); } function iadd($a, $b) { $res = ""; $mente = 0; for($i = LENGTH - 1; $i >= 0; $i--) { $tmp = intval($a[$i]) + intval($b[$i]) + $mente; $res = strval($tmp % RADIX) . $res; $mente = $tmp / RADIX; } return $res; } function isub($a, $b) { $res = ""; $borrow = 0; for($i = LENGTH - 1; $i >= 0; $i--) { $tmp = intval($a[$i]) - intval($b[$i]) - $borrow; if($tmp < 0) { $tmp += RADIX; $borrow = 1; } else { $borrow = 0; } $res = strval($tmp) . $res; } return $res; } function iscale($v, $n) { $res = ""; $mente = 0; for($i = LENGTH - 1; $i >= 0; $i--) { $tmp = $n * intval($v[$i]) + $mente; $res = strval($tmp % RADIX) . $res; $mente = $tmp / RADIX; } return $res; } function imul($a, $b) { $res = izero(); for($i = LENGTH - 1; $i >= 0; $i--) { $res = iadd($res, ishiftl(iscale($a, intval($b[$i])), LENGTH - $i - 1)); } return $res; } function ieq($a, $b) { return $a == $b; } function ine($a, $b) { return !ieq($a, $b); } function ile($a, $b) { for($i = 0; $i < LENGTH; $i++) { if(intval($a[$i]) < intval($b[$i])) { return TRUE; } if(intval($a[$i]) > intval($b[$i])) { return FALSE; } } return TRUE; } function ilt($a, $b) { for($i = 0; $i < LENGTH; $i++) { if(intval($a[$i]) < intval($b[$i])) { return TRUE; } if(intval($a[$i]) > intval($b[$i])) { return FALSE; } } return FALSE; } function igt($a, $b) { return !ile($a, $b); } function ige($a, $b) { return !ilt($a, $b); } function idiv($a, $b) { if(ilt($a, $b)) { return izero(); } else { $tmp = ione(); while(ile(imul($b, ishiftl($tmp, 1)), $a)) $tmp = ishiftl($tmp, 1); return iadd($tmp, idiv(isub($a, imul($tmp, $b)), $b)); } }