Avatar billede jalaba Nybegynder
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);
?>
Avatar billede dmdisco Nybegynder
07. januar 2008 - 19:25 #1
/forskellige udregninger
$sum1 = $numberX + $numberY;
$sum2 = $numberX * $numberY;
$sum3 = $numberX / $numberY;
$sum4 = $numberX - $numberY;
Avatar billede dmdisco Nybegynder
07. januar 2008 - 19:25 #2
Avatar billede arne_v Ekspert
07. januar 2008 - 19:44 #3
PHP division kalder noget kode der er oversat fra C som bruger den divisions instruktion der
findes til den paagaeldende CPU arkitektur.

Er du interesseret i at vide hvordan CPU'en laver en division ?
Avatar billede zurekk Nybegynder
08. januar 2008 - 08:37 #4
Arne_v ->

Jeg er : )
Avatar billede jalaba Nybegynder
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.
Avatar billede arne_v Ekspert
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.
Avatar billede arne_v Ekspert
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));
    }
}
Avatar billede arne_v Ekspert
10. januar 2008 - 04:07 #8
Det er stadigvæk ikke optimalt.
Avatar billede arne_v Ekspert
10. januar 2008 - 04:11 #9
Og bemærk ovenstående er til positive heltal.

At håndtere negative tal er ikek svært at tilføje.

Floating point tal er en helt anden boldgade.
Avatar billede zurekk Nybegynder
03. februar 2008 - 14:47 #10
Tak :D
Avatar billede arne_v Ekspert
09. juni 2008 - 04:53 #11
Tid at få afsluttet her ?

Og et svar fra mig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester