Avatar billede jonashn Nybegynder
02. februar 2006 - 13:54 Der er 19 kommentarer og
1 løsning

Problem med datatypekonvertering

Hej Alle!

Jeg er ved at konstruere en 'manuel' datatype, hvor jeg selv laver alle funktioner, add osv, for at kunne arbejde med meget store tal i js.
Tallene gemmes i et array, men jeg har et problem med add-funktionen:

for (i=0;i<=num.length;i++) {
    toAdd=(Number(num[num.length-i]))+carry;
    if(!toAdd+Number(num[i])<9) {
        temp=Number(toAdd)+Number(num[i])
        arr[arr.length-i]=temp;
    }
Håber den kan læses!

Problemet er at den ikke vil konvertere num[i] til et tal...
(jeg er nødt til at konvertere det til en string for at kunne bruge charAt) Den kommer bare op med nan, men jeg har jo konverteret med Number? I øvrigt er indholdet af num f.eks [1,2,4,7,9] og _num [1].
Num er tallet der skal addes til, og _num er inputtallet.
Avatar billede jonashn Nybegynder
02. februar 2006 - 13:58 #1
...if'en checker om der er mente, og else'n (+ slutningen af løkken) ser sådan ud:
    else {
        arr[arr.length-i]=toAdd+Number(num[i])-10;
            carry=toAdd-10;
    }
}
Avatar billede jonashn Nybegynder
02. februar 2006 - 14:09 #2
...og charAt bruges tidligere i funktionen.
Avatar billede olebole Juniormester
03. februar 2006 - 09:39 #3
<ole>

Jeg forstår ikke helt problemet - og hvorfor det skulle være nødvendigt med en special-type.
Dernæst forstår jeg ikke helt, hvad det er, du prøver at gøre med koden, du viser  :)

/mvh
</bole>
Avatar billede jonashn Nybegynder
03. februar 2006 - 13:33 #4
Undskylder. Jeg har ikke forklaret det godt nok.

Jeg vil gerne arbejde med meget større tal end js understøtter, og derfor vil jeg gerne oprette en klasse, der kan arbejde med tal, som gemmes i et array, eks tallet 123456789 bliver til [1,2,3,4,5,6,7,8,9].

Her er hele koden:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Nyt dokument</title>
<meta name="generator" content="TSW WebCoder">

<script type="text/javascript">
function Long(num,fppos) {
    numArr=new Array(num.length);
    for(i=0;i<num.length;i++) {
        numArr[i]=num.charAt(i);
    }
    this.add=_add;
    this.get=_get;
    this.mul=_mul;
    this.fppos=fppos;
    this.numArr=numArr;
}



function _add(_num) {
    var carry=0,num=new Array(),toAdd=0;
    var arr=this.numArr;
    //LONG-OBJEKT?
    if(!_num.numArr) {
    _num=String(_num)
        for (i=0;i<_num.length;i++) {
            num[i]=String(_num.charAt(i));
        }
    }

    else {
        num=num.numArr;
    }
    //END


    for (i=0;i<=num.length;i++) {
        toAdd=(Number(num[num.length-i]))+carry;
        if(!toAdd+Number(num[i])<9) {
            temp=Number(toAdd)+Number(num[i])
            arr[arr.length-i]=temp;
        }
        else {
            arr[arr.length-i]=toAdd+Number(num[i])-10;
            carry=toAdd-10;
        }
    }

    alert(this.numArr.join(""));
    alert(arr.join(""));
}

function _get() {

}

function _mul(num) {

}


jonas=new Long("103310");
jonas.add(1)
</script>

</head>

<body>



</body>
</html>

Ideen er at manuelt konstruere alle talfunktioner.

Håber det er lidt mere forståeligt nu!
Avatar billede jonashn Nybegynder
03. februar 2006 - 13:38 #5
- get bruges til at udskrive tallet som en streng, eks return this.numArr.join("");.
Fppos er til kommatal, men jeg vil først lave heltalsfunktionerne.

Mul er multipliceringsfunktionen, og der skal selvfølgelig også laves en divisions-funkt.
Avatar billede jonashn Nybegynder
03. februar 2006 - 13:39 #6
Fppos>Floating point position :-)
Avatar billede roenving Novice
03. februar 2006 - 17:44 #7
Måske kan du meget lettere bruge den unary operator + !-)

    for (i=0;i<=num.length;i++) {
        toAdd=+num[num.length-i]+carry;
        if(!+toAdd + +num[i]<9) {
            temp = +toAdd + +num[i];
            arr[arr.length-i]=temp;
        }
        else {
            arr[arr.length-i] = +toAdd + +num[i]-10;
            carry = +toAdd-10;
        }
    }

-- ligeledes kan man konvertere til streng ved simpelthen at lægge den tomme streng til:

    _num = "" + _num;
Avatar billede jonashn Nybegynder
04. februar 2006 - 12:11 #8
Tak for svaret... Den alerter bare stadig NaN?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Nyt dokument</title>
<meta name="generator" content="TSW WebCoder">

<script type="text/javascript">
function Long(num,fppos) {
numArr=new Array(num.length);
for(i=0;i<num.length;i++) {
  numArr[i]=num.charAt(i);
}
this.add=_add;
this.get=_get;
this.mul=_mul;
this.fppos=fppos;
this.numArr=numArr;
}



function _add(_num) {
    var carry=0,num=new Array(),toAdd=0;
    var arr=this.numArr;
    //LONG-OBJEKT?
    if(!_num.numArr) {
    _num=String(_num)
        for (i=0;i<_num.length;i++) {
            num[i]=String(_num.charAt(i));
        }
    }

    else {
        num=num.numArr;
    }
    //END


    for (i=0;i<=num.length;i++) {
        toAdd=+num[num.length-i]+carry;
        if(!+toAdd + +num[i]<9) {
            temp = +toAdd + +num[i];
            arr[arr.length-i]=temp;
        }
        else {
         
            arr[arr.length-i] = +toAdd + +num[i]-10;
            carry = +toAdd-10;
        }
    }

    alert(this.numArr.join(""));
    alert(arr.join(""));
}

function _get() {

}

function _mul(num) {

}


jonas=new Long("103310");
jonas.add(1)
</script>

</head>

<body>




</body>
</html>
Avatar billede jonashn Nybegynder
04. februar 2006 - 12:11 #9
Hovsa.. skulle have været en kommentar
Avatar billede jonashn Nybegynder
18. februar 2006 - 19:44 #10
Du kan ikke finde fejlen?
Avatar billede jonashn Nybegynder
08. april 2006 - 20:44 #11
er her nogen?
Avatar billede olebole Juniormester
19. april 2006 - 21:27 #12
Jeg er her ikke ret meget for tiden - og det tror jeg også gælder roenving. Problemet er, at du konstant - og ret ukritisk - veksler mellem at behandle variabler som strenge og tal.

Hvor store tal skal du regne med? Dette håndterer JS da okay:

var a = 1234567890123456789012345678901234567890;
var b = 1234567890123456789012345678901234567890;
alert(a*b)

- :)
Avatar billede jonashn Nybegynder
20. april 2006 - 17:51 #13
jo, men jeg vil gerne kunne arbejde med f.eks. 200 cifre.
Avatar billede jonashn Nybegynder
20. april 2006 - 17:53 #14
-og du har ret i, at jeg behandler variabler skiftende, men det er jeg jo nødt til til formølet (men da jeg jo ikke er 'prof' er det måske ikke helt logisk lavet).
Avatar billede olebole Juniormester
22. april 2006 - 19:08 #15
Nej, det er det nok ikke  :)

Desuden skal du vel bagefter kunne bruge tallene til noget, hvilket betyder, du efterfølgende skal til at skrive et helt nyt Math-objekt, da ingen af JS' Math-funktioner kan benytte så store tal.
Til gengæld er potens-/logaritme-regning jo netop beregnet til at regne med voldsomt store og/eller små tal - så mon ikke, det var en idé at bruge noget matematik og JS' Math-funktioner(?):
    http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Predefined_Core_Objects:Math_Object
Avatar billede jonashn Nybegynder
23. april 2006 - 18:33 #16
Det var nok en idé... Læg et svar olebole!
Avatar billede olebole Juniormester
25. april 2006 - 14:39 #17
- gerne, men fandt du ud af en alternativ løsning?

- og lige for at stille min egen nysgerrighed: Hvad skal du egentlig bruge det til med alle de ciffre? Jeg får syge billeder af en PC-bevæbnet ekspedient i en skoforretning for folk med _ekstremt_ store fødder ... men det er formodentlig helt hen i vejret  ;oD
Avatar billede olebole Juniormester
25. april 2006 - 14:39 #18
- og svaret  :)
Avatar billede jonashn Nybegynder
26. april 2006 - 15:41 #19
Tjaa... Det var bare som en øvelse, og til at lave store fibonacci tal og lign :).. Og jeg besluttede bare at bruge javascripts indbyggede numbersystem... Hvis man skal lave sit eget number-obj er det nok snarere noget man gør i C/C++(som jeg også lige er begyndt at bakse med)!
Avatar billede olebole Juniormester
26. april 2006 - 15:49 #20
JavaScript kan utrolig meget - og det _kan_ lade sig gøre, meeeeeeeeeen ... du har helt ret  ;o)
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