Avatar billede burningice Nybegynder
29. oktober 2004 - 04:28 Der er 9 kommentarer og
1 løsning

Forskelligheder mellem C# og JavaScript i matematiske udregninger

Er stødt på en rimelig frustrende problem i forbindelse med omksrivning af en javascript-funktion til C#. Det viser sig at funktionen i JavaScript giver et andet output end C# med de samme input.

java script:

function interpolate (x1, y1, x3, y3, x2) {
  if (x3 == x1) return y1
  else return (x2-x1)*(y3-y1)/(x3-x1) + y1
}

C#:

        private double interpolate(double x1, double y1, double x3, double y3, double x2)
        {
            if (x3 == x1)
            {
                return y1;
            }
            else
            {
                return (x2-x1)*(y3-y1)/(x3-x1) + y1;
            }
        }

Det er ikke store forskellige, men alligevel nok til at smadre mine senere udregninger :(

Nogen der kan afprøve ovenstående og se om de også får forskellige outputs, og evt. kan komme med en forklaring på dette?
Avatar billede arne_v Ekspert
29. oktober 2004 - 08:27 #1
Hvad data type vil JavaScript bruge i beregningen ?

Med værdier tæt på hinanden kunne float godt give lidt andre resultater
end double.

x3 == x1 kan også være tricky. Math.Abs(x3-x1)<0.00000001 måske.
Avatar billede erikjacobsen Ekspert
29. oktober 2004 - 09:18 #2
Har du et eksempel på forskel i udregningerne?
Avatar billede burningice Nybegynder
29. oktober 2004 - 11:53 #3
c#

interpolate(0*43, 0^23-12/52*34+0, 33*0/33-0*23, 324, 43*0) = 23
interpolate(1*43, 1^23-12/52*34+1, 33*1/33-1*23, 324, 43*1) = 218,2
interpolate(2*43, 2^23-12/52*34+2, 33*2/33-2*23, 324, 43*2) = 218,907692307692
interpolate(3*43, 3^23-12/52*34+3, 33*3/33-3*23, 324, 43*3) = 218,2
interpolate(4*43, 4^23-12/52*34+4, 33*4/33-4*23, 324, 43*4) = 220,323076923077
interpolate(5*43, 5^23-12/52*34+5, 33*5/33-5*23, 324, 43*5) = 218,2
interpolate(6*43, 6^23-12/52*34+6, 33*6/33-6*23, 324, 43*6) = 218,907692307692
interpolate(7*43, 7^23-12/52*34+7, 33*7/33-7*23, 324, 43*7) = 218,2
interpolate(8*43, 8^23-12/52*34+8, 33*8/33-8*23, 324, 43*8) = 217,492307692308
interpolate(9*43, 9^23-12/52*34+9, 33*9/33-9*23, 324, 43*9) = 223,861538461538
interpolate(10*43, 10^23-12/52*34+10, 33*10/33-10*23, 324, 43*10) = 224,569230769231
interpolate(11*43, 11^23-12/52*34+11, 33*11/33-11*23, 324, 43*11) = 223,861538461538
interpolate(12*43, 12^23-12/52*34+12, 33*12/33-12*23, 324, 43*12) = 225,984615384615
interpolate(13*43, 13^23-12/52*34+13, 33*13/33-13*23, 324, 43*13) = 223,861538461538
interpolate(14*43, 14^23-12/52*34+14, 33*14/33-14*23, 324, 43*14) = 224,569230769231
interpolate(15*43, 15^23-12/52*34+15, 33*15/33-15*23, 324, 43*15) = 223,861538461538
interpolate(16*43, 16^23-12/52*34+16, 33*16/33-16*23, 324, 43*16) = 228,815384615385
interpolate(17*43, 17^23-12/52*34+17, 33*17/33-17*23, 324, 43*17) = 229,523076923077
interpolate(18*43, 18^23-12/52*34+18, 33*18/33-18*23, 324, 43*18) = 230,230769230769
interpolate(19*43, 19^23-12/52*34+19, 33*19/33-19*23, 324, 43*19) = 229,523076923077

java script:

interpolate(0*43, 0^23-12/52*34+0, 33*0/33-0*23, 324, 43*0) = 15
interpolate(1*43, 1^23-12/52*34+1, 33*1/33-1*23, 324, 43*1) = 215.36923076923077
interpolate(2*43, 2^23-12/52*34+2, 33*2/33-2*23, 324, 43*2) = 216.07692307692307
interpolate(3*43, 3^23-12/52*34+3, 33*3/33-3*23, 324, 43*3) = 215.36923076923077
interpolate(4*43, 4^23-12/52*34+4, 33*4/33-4*23, 324, 43*4) = 217.4923076923077
interpolate(5*43, 5^23-12/52*34+5, 33*5/33-5*23, 324, 43*5) = 215.36923076923077
interpolate(6*43, 6^23-12/52*34+6, 33*6/33-6*23, 324, 43*6) = 216.07692307692307
interpolate(7*43, 7^23-12/52*34+7, 33*7/33-7*23, 324, 43*7) = 215.36923076923077
interpolate(8*43, 8^23-12/52*34+8, 33*8/33-8*23, 324, 43*8) = 220.3230769230769
interpolate(9*43, 9^23-12/52*34+9, 33*9/33-9*23, 324, 43*9) = 215.36923076923077
interpolate(10*43, 10^23-12/52*34+10, 33*10/33-10*23, 324, 43*10) = 216.07692307692307
interpolate(11*43, 11^23-12/52*34+11, 33*11/33-11*23, 324, 43*11) = 215.36923076923077
interpolate(12*43, 12^23-12/52*34+12, 33*12/33-12*23, 324, 43*12) = 217.4923076923077
interpolate(13*43, 13^23-12/52*34+13, 33*13/33-13*23, 324, 43*13) = 215.36923076923077
interpolate(14*43, 14^23-12/52*34+14, 33*14/33-14*23, 324, 43*14) = 216.07692307692307
interpolate(15*43, 15^23-12/52*34+15, 33*15/33-15*23, 324, 43*15) = 215.36923076923077
interpolate(16*43, 16^23-12/52*34+16, 33*16/33-16*23, 324, 43*16) = 214.66153846153847
interpolate(17*43, 17^23-12/52*34+17, 33*17/33-17*23, 324, 43*17) = 226.69230769230768
interpolate(18*43, 18^23-12/52*34+18, 33*18/33-18*23, 324, 43*18) = 227.4
interpolate(19*43, 19^23-12/52*34+19, 33*19/33-19*23, 324, 43*19) = 226.69230769230768
Avatar billede arne_v Ekspert
29. oktober 2004 - 11:57 #4
Prøv lige og sæt nogle .0 på i C# koden !
Avatar billede burningice Nybegynder
29. oktober 2004 - 11:57 #5
ja... javascript er vist ikke så typesafe så jeg ved virkelig ikke hvilke typer der er
Avatar billede arne_v Ekspert
29. oktober 2004 - 11:59 #6
Hov !!!!!!!!!!!!!!!!

^ er vel XOR i C# og ikke Math.Pow ????
Avatar billede burningice Nybegynder
29. oktober 2004 - 12:08 #7
ja, der der da der også... det var nu din .0-kommentar der ledte mig på rette spor. Ovenstående var bare nogle test-udreginger, de oprindelige har ikke ^ i sig.

Ved at caste ALLE mine tag til double virkede det

rr = (int)Math.Round(interpolate((double)lci/(double)(numColors-1),(double)colorList.Codes[lci].r, (double)hci/(double)(numColors-1), (double)colorList.Codes[hci].r, (double)i/(double)(detail-1)));
                gg = (int)Math.Round(interpolate((double)lci/(double)(numColors-1), (double)colorList.Codes[lci].g, (double)hci/(double)(numColors-1), (double)colorList.Codes[hci].g, (double)i/(double)(detail-1)));
                bb = (int)Math.Round(interpolate((double)lci/(double)(numColors-1), (double)colorList.Codes[lci].b, (double)hci/(double)(numColors-1), (double)colorList.Codes[hci].b, (double)i/(double)(detail-1)));
Avatar billede burningice Nybegynder
29. oktober 2004 - 12:12 #8
så.. hvis der er nogen der skal bruge en ColorGradient'er, så er det bare at sige til :)

eksempel: http://mpaconsult.dk/colorGenerator.aspx?colors=FFF4FF,FFFFFF&detail=20
Avatar billede burningice Nybegynder
29. oktober 2004 - 13:36 #9
læg lige et svar, arne
Avatar billede arne_v Ekspert
29. oktober 2004 - 14:28 #10
her
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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