Avatar billede rasmuss Nybegynder
06. juni 2001 - 13:16 Der er 38 kommentarer og
1 løsning

??????

Jeg er bruger af Visual Basic 6.0, men jeg vil måske begynde på C++ så jeg vil vide om det er rigtigt at man skal skrive en masse for at gøre meget lidt. Og hvis der er nogle VB brugere som kan svare mig på \"hvad er bedst!!!\" C++ eller Visual Basic 6.0???
Avatar billede borrisholt Novice
06. juni 2001 - 13:21 #1
Der findes en C++ der ligner VB med design af skærmbilleder etc. Hvad der er BEDST ? Og det spørger du om i en C++ gruppe ?

Jens B
Avatar billede wisen Nybegynder
06. juni 2001 - 13:24 #2
Hmm, det svar kender du vist allerede :)
Avatar billede rasmuss Nybegynder
06. juni 2001 - 14:01 #3
Altså C++ er bedst!!

borrisholt Kan man downloade det C++ der ligner VB?? og hvis man kan hvor

Avatar billede borrisholt Novice
06. juni 2001 - 14:05 #4
rasmuss >> Nej den kan købes af Borland (www.borland.com). (vist ret dyr).

Min pointer er blot at hvis du spørger her hvad der er bedst så får du svaret C++ og omvendt hvis du spørger i VB gruppen.

Jens B
Avatar billede emileej Nybegynder
06. juni 2001 - 18:22 #5
Du kan komme langt med erfaring i C++, da mange firmaer søger medarbejdere, der kan dette, samt der er mange programmeringssprog, der er bygget på C++ syntaksen. Basic derimod er der ikke rigtigt noget der ligner, så jeg syndes at mulighederne på den måde er ringere end i C++.
Programmeringsmæssigt, er C++ mange ting - det kommer helt an på editoren - der er dem, som Borrisholt snakker om - det er nøjagtigt lige så nemme som VB (måske nemmere, men igen - jeg er c++ mand :) ), og så er der den goda gamle stil, hvor man sætter sig ned med sin notepad og en eller anden compiler (det er hardcore, og du skal lave MEGET for at nå lidt).
Borlands C++ Builder, som Borrisholt snakker om, er nok den jeg vil anbefale dig, da du lydder som en der godt vil se resultaterne af din programmering hurtigt (har jeg ret?) :)
Igen, er det måske bare fordi at jeg er C++ mand og anvender Borland C++ Builder selv :)

E-)mil
http://eej.dk
http://fotx.net/emileej
Avatar billede emileej Nybegynder
06. juni 2001 - 18:23 #6
Pyyyhhh!
Skrev jeg virkeligt alt det?! :)~
Avatar billede psp_psp Nybegynder
07. juni 2001 - 10:36 #7
rasmus

Hvis du programmerer i VB og gerne vil forstå C/C++ fra grunden er PowerBasic en god ide. Jeg har lært C/C++ ved hjælp af PowerBasic.

PowerBasic er en basic-kompiler der har alle C\'s pointer-egenskaber (indekserede pointere, code pointers osv.). Man kan lave ægte exe\'er og dll\'er der kører lige så hurtigt som i C/C++ og som fylder klart mindre end i C/C++. Mange VB-folks bruger PB til at lave hurtige dll\'er som de kalder fra VB. Ved at bruge PowerBasic kan du få C/C++\'s speed uden at skifte sprog! På længere sigt kan du uden de store problemer gå over til C/C++. Du kan læse mere på http://www.powerbasic.com

Peter

P.S.
Jeg arbejder ikke for PB :)
Avatar billede rasmusneckelmann Nybegynder
07. juni 2001 - 18:03 #8
Jeg har også arbejdet meget med PowerBASIC, men jeg blev træt af at løbe panden mod muren hele tiden... Der er alt for mange problemer ved at bruge et sprog som ikke er objektorienteret. (Syntes JEG).
Avatar billede emileej Nybegynder
07. juni 2001 - 19:17 #9
Der er heller ikke meget mening i at lære et programmeringssprog - bare for at lære et andet :)

E-)mil
Avatar billede psp_psp Nybegynder
08. juni 2001 - 09:49 #10
rasmusneckelmann -> Ja, PB burde være OO. Håber det kommer i version 7. Hvis ikke det kommer, dør PB. Hvis det kommer er jeg sikker på at de har lavet noget der er langt bedre end VB\'s \"børnehave-klasser\". Nu da VB går i stå på grund af .NET har PB alle chancer for at blive et stort sprog. Håber de tager chancen!

emileej -> Du har ret. Jeg så bare en chance for at reklamere for et sprog jeg syntes bruges alt for lidt i Danmark. Hvis du læser i forum\'et på PB\'s hjemmeside vil du se nogle meget begejstrede brugere. Hvis man har basic-baggrund er det et sus at få adgang til det store C-univers UDEN at skifte sprog.

PB Forum\'et er forøvrigt ret enestående. Det indeholder enorme mængder af brugbar kode, og hvis man kommer med et spørgsmål får man som regel svar fra erfarne PB-brugere inden for få minuter.

Peter
Avatar billede rasmuss Nybegynder
13. juni 2001 - 12:58 #11
Tak for det alle sammen, jeg tror at jeg er overbevist om at jeg vil begynde på C++.      Måske PowerBasic?.
Avatar billede emileej Nybegynder
13. juni 2001 - 22:25 #12
Jeg syndes det samme som jeg hele tiden har syndes : Det er spild af tid, at begynde på et sprog bare for at lære et andet... :)
Avatar billede borrisholt Novice
14. juni 2001 - 08:23 #13
emileej  >> Du har så evrig ret. Basic ER spild af tid !

Jens B
Avatar billede psp_psp Nybegynder
14. juni 2001 - 09:43 #14
borrisholt >> Hvis tid snakker du om: udviklerens eller brugerens?

Hvad med en lille konkurrence (i al venskabelighed):

Du laver et C++ program. Jeg oversætter det til PB så det fylder mindre og kører hurtigere.

Peter
Avatar billede borrisholt Novice
14. juni 2001 - 09:46 #15
psp_psp>> Begge to !

konkurencen er jeg med på !!! Bare husk Hvis du linker dynamisk, så linker jeg også dynamisk etc ....

Jeg skal gøre mit bedste, selv om min helt stærke side er Delphi ....

Hvad skal vi lave beregne pi med 1.000.000 decimaler ?

Jens B
Avatar billede psp_psp Nybegynder
14. juni 2001 - 09:57 #16
borrisholt >> Godt nok! Det der med pi er OK hvis du har en algoritme (den eneste jeg kender er 22/7 :D)

Peter
Avatar billede borrisholt Novice
14. juni 2001 - 10:06 #18
Pi = 1 -1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 + . . .

her er et c++ program der kan gøre det :

http://home.earthlink.net/~kamradt/pi.c

Jens B

Avatar billede psp_psp Nybegynder
14. juni 2001 - 10:59 #19
OK, skal vi prøve det link
Jeg er faktisk på arbejde...jeg prøver at få lavet det i dag/aften. Du hører fra mig senest i morgen.

Peter
Avatar billede psp_psp Nybegynder
14. juni 2001 - 11:06 #20
borrisholt >> pi.c kan ikke umiddelbart køres i VC++. Der er problemer med mem-allokeringen. Ku\' du ikke lave et VC++ projekt der kører?

mvh
Peter
Avatar billede borrisholt Novice
14. juni 2001 - 11:08 #21
Jeg har ikke tested koden ... Jeg så bare linken ... Men jeg skal nok lave dig et c++ projekt ....

Jens B
Avatar billede borrisholt Novice
14. juni 2001 - 11:31 #22
Jeg har lidt delphi kode på lager (jeg er også på arbejde) så må du nøjes med det :

var
    Digits:string;
    PDig:pchar;
    pos:integer;

procedure SetupDigits(len:integer);
begin
    SetLength(Digits,len+2);
    Digits[1]:=\'3\';
    Digits[2]:=\'.\';
    pos:=3;
    Digits[pos]:=#0;
    PDig:=pchar(Digits);
end;

procedure OutDig(dig:integer);
begin
    Digits[pos]:=char(ord(\'0\')+dig);
    inc(pos);
end;

procedure CalcPIOriginal(numdig:integer);
var
    i,j,k,nines,predigit:cardinal;
    q,x,len:cardinal;
    pi:array of cardinal;

begin
    len := (numdig*10) div 3;
    SetLength(pi,len+1);
    for i:=1 to len do
        pi[i]:=2;
    nines := 0;
    predigit := 0;
    SetupDigits(len);
    for j:=0 to numdig do
    begin
        q:=0;
        for i:=len downto 1 do
        begin
            x:=10*pi[i]+q*i;
            pi[i]:=x mod (2*i -1);
            q:=x div (2*i-1);
        end;
        pi[1]:=q mod 10;
        q:=q div 10;
        if (q=9) then
            inc(nines)
        else if q=10 then
        begin
            OutDig(1+predigit);
            while nines>0 do
            begin
                OutDig(0);
                dec(nines);
            end;
      predigit:=0;
        end
        else
        begin
            if j>1 then
                OutDig(predigit);
            while nines>0 do
            begin
                OutDig(9);
                dec(nines);
            end;
            predigit:=q;
        end;
    end;
    OutDig(predigit);
end;

Tag dig endelig god tid, så måler vi på mandag ....


Las os være enige om reglerne : alle kneb er tilladt. Dog ikke Assembler ....
JEns B
Avatar billede psp_psp Nybegynder
14. juni 2001 - 11:36 #23
Jeg syntes det skal være den samme grundlæggende kode vi bruger. Ellers bliver sammenligning lidt svær. pi.c ser OK ud for mig. Vi skal bare ha\' den op at køre i VC++. Jeg ser på det når jeg får tid

Peter
Avatar billede emileej Nybegynder
14. juni 2001 - 13:49 #24
Yir!
BASIC vs. C++!!!!
Kewl!
Avatar billede psp_psp Nybegynder
14. juni 2001 - 15:14 #25
borrisholt >> OK så kører det i VC++. Jeg prøver at lave denne her i PB:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define BASE 10000

typedef unsigned short DIGIT;
typedef unsigned long DIGIT2;
typedef signed long SDIGIT2;

void arctan(DIGIT *, int, int);
void multiply(DIGIT *, int, int);
void divide(DIGIT *, int, int);
void add(DIGIT *, DIGIT *, int);
void subtract(DIGIT *, DIGIT *, int);
void print(DIGIT *, int);
void nset(DIGIT *, int, int);
void ncopy(DIGIT *, DIGIT *, int);
int iszero(DIGIT *, int);
void *emalloc(unsigned);

int main(int argc, char **argv) {
  int digits, nsize;
  DIGIT *t1, *t2;

  if (argc != 2) {
    fprintf(stderr, \"usage: %s digits\\n\", argv[0]);
    exit(1);
  }
  digits = atoi(argv[1]);
  if (digits < 1) {
    fprintf(stderr, \"%s digits?\\n\", argv[1]);
    exit(1);
  }
  nsize = digits/4 + (int)log(digits/4 + 1) + 2;
  t1 = (DIGIT *)emalloc(sizeof(DIGIT)*nsize);
  t2 = (DIGIT *)emalloc(sizeof(DIGIT)*nsize);

  arctan(t1, 18, nsize);
  multiply(t1, 48, nsize);
  arctan(t2, 57, nsize);
  multiply(t2, 32, nsize);
  add(t1, t2, nsize);
  arctan(t2, 239, nsize);
  multiply(t2, 20, nsize);
  subtract(t1, t2, nsize);
  print(t1, digits);
  return 0;
}

void arctan(DIGIT *q, int x, int s) {
  DIGIT *n, *t;
  int x2, d, i;

  x2 = x*x;
  n = (DIGIT *)emalloc(sizeof(DIGIT)*s);
  t = (DIGIT *)emalloc(sizeof(DIGIT)*s);
  nset(q, 1, s);
  divide(q, x, s);
  ncopy(n, q, s);
  d = 3;
  for (i = 1;; i++) {
    divide(n, x2, s);
    ncopy(t, n, s);
    divide(t, d, s);
    if (iszero(t, s))
      break;
    if (i&1)
      subtract(q, t, s);
    else
      add(q, t, s);
    d += 2;
  }
  free(n);
  free(t);
}

void multiply(DIGIT *q, int u, int s) {
  DIGIT2 c;
  int i;

  c = 0;
  for (i = s-1; i >= 0; i--) {
    c += (DIGIT2)q[i]*u;
    q[i] = c % BASE;
    c /= BASE;
  }
}

void divide(DIGIT *q, int u, int s) {
  DIGIT2 c;
  int i;

  c = 0;
  for (i = 0; q[i] == 0; i++)
    ;
  for (; i < s; i++) {
    c = c*BASE + q[i];
    q[i] = c/u;
    c %= u;
  }
}

void add(DIGIT *q, DIGIT *u, int s) {
  DIGIT2 c;
  int i;

  c = 0;
  for (i = s-1; i >= 0; i--) {
    c += (DIGIT2)q[i] + u[i];
    if (c < BASE) {
      q[i] = c;
      c = 0;
    }
    else {
      q[i] = c - BASE;
      c = 1;
    }
  }
}

void subtract(DIGIT *q, DIGIT *u, int s) {
  SDIGIT2 c;
  int i;

  c = 0;
  for (i = s-1; i >= 0; i--) {
    c += (SDIGIT2)q[i] - u[i];
    if (c < 0) {
      q[i] = BASE + c;
      c = -1;
    }
    else {
      q[i] = c;
      c = 0;
    }
  }
}

void print(DIGIT *q, int d) {
  int i, j, x;

  printf(\"%d.\", q[0]);
  for (i = 1; i <= d/4; i++)
    printf(\"%04d\", q[i]);
  x = d % 4;
  if (x) {
    for (j = 4; j > x; j--)
      q[i] /= 10;
    printf(\"%0*d\\n\", x, q[i]);
  }
  else
    putchar(\'\\n\');
}

void nset(DIGIT *q, int u, int s) {
  int i;

  q[0] = u;
  for (i = 1; i < s; i++)
    q[i] = 0;
}

void ncopy(DIGIT *q, DIGIT *u, int s) {
  int i;

  for (i = 0; i < s; i++)
    q[i] = u[i];
}

int iszero(DIGIT *q, int s) {
  int i;

  for (i = 0; i < s; i++)
    if (q[i] != 0)
      return 0;
  return 1;
}

void *emalloc(unsigned size) {
  void *memory;

  memory = malloc(size);
  if (memory == NULL) {
    fprintf(stderr, \"out of memory\");
    exit(1);
  }
  return memory;
}
Avatar billede borrisholt Novice
14. juni 2001 - 18:03 #26
Jeg har endnu ikke ported min dims til C++. Meeen jeg har en Delphi dims der kan beregne PI på
0,1575 sekund på en PIII 1050 mhz. Måske vi hellere skulle måle i clock cykler ?

Jens B
Avatar billede borrisholt Novice
14. juni 2001 - 18:05 #27
psp_psp  >> KAN man lave en procedure i Asembler i Basic ? Fordi den eneste rigtige måleenhed vi har er clock cycels. Og til det SKAL man bruge assembler ....

Jens B
Avatar billede psp_psp Nybegynder
14. juni 2001 - 23:16 #28
I PB kan man slå over i asembler når og hvor man vil. Men var det ikke lettere at sende exe-filerne til hinanden, og så hverisær teste dem mod hinanden?

Jeg syntes ikke dette skal ende i en algoritme-konkurrence. Hellere en konkurrence mellem PB og C++. Det kræver at vi implementerer den samme algoritme. Defor ville jeg foreslå at du udpeger en C++ - algoritme, og så oversætter jeg den til PB. Hvad siger du til det?

Peter



Peter
Avatar billede borrisholt Novice
15. juni 2001 - 08:46 #29
Peter>>> God ide .... Jeg skal lige porte min til C++

Jens B
Avatar billede borrisholt Novice
15. juni 2001 - 10:21 #30
her er min C++ algoritme :

#include \"stdafx.h\"
#include <windows.h>

#define Cardinal unsigned int
#define pCardinalArray unsigned *

char *PDig;

int  pos;

void __fastcall SetupDigits(const int len)
{
  PDig = new char[len+2];
  PDig[0] =\'3\';
  PDig[1] =\'.\';
  pos =2;
  PDig[pos] = \'\\0\';
}

Cardinal __fastcall Inner(pCardinalArray pi,  const Cardinal len)
{
  Cardinal j = 10;
  Cardinal Result = 0;
  Cardinal  i = len;
  Cardinal x,k;

  while (i>0)
  {
    x = j*pi[i] + Result*i;
    k = i+i-1;
    Result = (x / k); //result = x div k

    pi[i] = x-Result*k;
    i--;
  }
  return Result;
}

void  __fastcall OutDig(const int dig)
{
  PDig[pos] = char(48+dig); //48 er ASCII værdien of 0 (NUL)
  pos++;
}

void  __fastcall CalcPI(const int numdig)
{
  Cardinal i,nines,predigit;
  Cardinal len,q,qi;
  Cardinal *pi;
  int j;

  len = ((numdig*10) / 3); //len = (numdig*10) div 3

  pi = new Cardinal[len+1];

  for (i =1; i<=len; ++i)
    pi[i] = 2;

  nines = 0;
  predigit = 0;
  SetupDigits(len);

  j = 0;

  do
  {
    qi = Inner(pi,len);
    q = qi /10; //q = qi div 10

    pi[1] = qi-q*10;

    if (q==9)
      nines++;
    else if (q==10)
    {
      OutDig(1+predigit);

      while (nines>0)
      {
        OutDig(0);
        nines--;
      }

      predigit = 0;
    }
    else
    {
        if (j>1)
          OutDig(predigit);

        while (nines>0)
        {
          OutDig(9);
          nines--;
        }

        predigit = q;
    }
  j++;
  }while (j<=numdig);

  OutDig(predigit);
}

int main(int argc, char* argv[])
{
  LARGE_INTEGER Start, Stop, Freq;
  float p = 0;
 
  for (int i=0; i<100; ++i)
  {
    QueryPerformanceCounter(&Start);
    CalcPI(1000);
    QueryPerformanceCounter(&Stop);
    QueryPerformanceFrequency(&Freq);
    float f = ((float)Stop.QuadPart - (float)Start.QuadPart) / (float)Freq.QuadPart;
    p += f;
    printf(\"%f\\n\", f);
  }

  printf(\"=================\\n\", p);
  printf(\"%f\\n\", (float)p / (float)100);
  return 0;
}


gennemsnits tid : 0.153510

Jens B

gennemsnits tid over 100
Avatar billede borrisholt Novice
15. juni 2001 - 10:56 #31
nu kan jeg vist ikke vride mere ud af den :

// pi.cpp : Defines the entry point for the console application.
//

#include \"stdafx.h\"
#include <windows.h>

#define Cardinal unsigned int
#define pCardinalArray unsigned *
#define OutDig(dig)  PDig[pos++] = char(48+dig)

char *PDig;

int  pos;

void __fastcall SetupDigits(const int len)
{
  PDig = new char[len+2];
  PDig[0] =\'3\';
  PDig[1] =\'.\';
  pos =2;
  PDig[pos] = \'\\0\';
}

Cardinal __fastcall Inner(pCardinalArray pi,  const Cardinal len)
{
  Cardinal j = 10;
  Cardinal Result = 0;
  Cardinal i = len;
  Cardinal x,k;

  while (i--)
  {
    x = j*pi[i] + Result*i;
    k = i+i-1;
    Result = (x / k); //result = x div k
    pi[i] = x-Result*k;
  }
  return Result;
}


void  __fastcall CalcPI(const int numdig)
{
  Cardinal i,nines,predigit;
  Cardinal len,q,qi;
  Cardinal *pi;
  int j;

  len = ((numdig*10) / 3); //len = (numdig*10) div 3

  pi = new Cardinal[len+1];

  for (i =1; i<=len; ++i)
    pi[i] = 2;

  nines = 0;
  predigit = 0;
  SetupDigits(len);

  j = 0;

  do
  {
    qi = Inner(pi,len);
    q = qi /10; //q = qi div 10

    pi[1] = qi-q*10;

    if (q==9)
      nines++;
    else if (q==10)
    {
      OutDig(1+predigit);

      while (nines--)
        OutDig(0);

      predigit = 0;
    }
    else
    {
        if (j>1)
          OutDig(predigit);

        while (nines)
        {
          OutDig(9);
          nines--;
        }

        predigit = q;
    }
  j++;
  }while (j<=numdig);

  OutDig(predigit);
}

int main(int argc, char* argv[])
{
  LARGE_INTEGER Start, Stop, Freq;
  float p = 0;
 
  for (int i=0; i<100; ++i)
  {
    QueryPerformanceCounter(&Start);
    CalcPI(1000);
    QueryPerformanceCounter(&Stop);
    QueryPerformanceFrequency(&Freq);
    float f = ((float)Stop.QuadPart - (float)Start.QuadPart) / (float)Freq.QuadPart;
    p += f;
    printf(\"%f\\n\", f);
  }

  printf(\"=================\\n\", p);
  printf(\"%f\\n\", (float)p / (float)100);
  return 0;
}

gennemsnit tid over 100 forsøg : 0.151831

Koden er PIII optimeret.

Jens B
Avatar billede psp_psp Nybegynder
15. juni 2001 - 15:41 #32
Jens B >> Jeg har oversat til PB. Umiddelbart er du 20% hurtigere. Jeg vil prøve at få tid til at optimere lidt mere i weekenden. Vi høres ved...

Peter
Avatar billede psp_psp Nybegynder
18. juni 2001 - 10:41 #33
Hej Jens B

Her er min kode:
\'----------------------------------------
#compile exe \"calpi.exe\"
#dim all
#register none
#include \"win32api.inc\"

global buffer as string
global PDig as byte pointer
global pos as long
global pi as long pointer

sub SetupDigits(byval length as long)
    buffer = space$(length+2) : PDig = strptr(buffer)
    pos = 2
    @PDig[0] = asc(\"3\")
    @PDig[1] = asc(\".\")
    @PDig[pos] = 0
end sub

sub CalcPI(byval numdig as long)

    register q as long, qi as long
    local lppi as dword
    local predigit as long
    local nines as long
    local length as long
    local i as long
    local j as long
    local k as long
    local x as long

    length = (numdig*10) \\ 3

    dim arr_pi(length) as long
    mat arr_pi() = con(2)
    pi = varptr(arr_pi(0))

    SetupDigits length

    do
        i = length
        while (i>0)
            x = 10*@pi[i] + qi*i
            k = i+i-1
            qi = x \\ k
            @pi[i] = x-qi*k
            decr i
        wend
        q = qi \\ 10

        @pi[1] = qi-q*10

        if (q=9) then
            incr nines
        elseif (q=10) then
            @PDig[pos] = 49+predigit
            incr pos

            while (nines>0)
                @PDig[pos] = 48
                incr pos

                decr nines
            wend

            predigit = 0

        else
            if (j>1) then
                @PDig[pos] = 48+predigit
                incr pos

            end if

            while (nines>0)
                @PDig[pos] = 57
                incr pos

                decr nines
            wend

            predigit = q
        end if
        incr j
    loop while (j<=numdig)

    @PDig[pos] = 48+predigit
    incr pos


end sub

%NUM = 100

function pbmain

    local qStart as quad, qStop as quad, qFreq as quad
    local p as double, i as long, f as double

    for i = 1 to %NUM
        QueryPerformanceCounter qStart
        CalcPI 1000
        QueryPerformanceCounter qStop
        QueryPerformanceFrequency qFreq
        f = (qStop - qStart) / qFreq
        p = p + f
        stdout format$(f, \"#.####\")
    next i

    stdout \"=================\"
    stdout format$(p/%NUM,\"#.####\")

end function
\'----------------------------------

På min PIII (933 mhz) kørte dit prgram på 0.1813 og mit kørte på 0.2108. Dvs. dit kørte 10.2% hurtigere end mit.

Jeg erkender mit nederlag! :)

Mit program fyldte 14 KB. Dit fyldte 34 KB.

mvh
Peter
Avatar billede borrisholt Novice
18. juni 2001 - 11:30 #34
Peter >> JEg er ikke stiv i VB, men er der ikke noget med at den skal bruge en DLL der hedder noger alla Vbrun300.dll (eller et nyere versions nummmer) ? Hvad sker der hvis du fjerner den dll fra dit system ?

Ellers folt klaret. Jeg troede VB af 15% langsommere ... Lige er par spørgsmål : Er du sikker på at while er den hurtigste løkke struktur ? Der er det fx ikke i Delphi, der bruger man repeat until. I Assembler skal det blive til :

@@1: //en label
//do stuf
inc eax
cmp eax, AntalLoops 
jl @1

Det viser sig iøvrigt at hvis du lader den køre nogle gange så går det lidt stærkere. du kan fx. loope indtil alle dine resultater ligger under en bestemt (realistisk) værdi.

Jeg prøvede værdien 0.16 og i løbet af en 15-20 forsøg kommer den i gennem alle 100 forsøg .... Der for uden har jeg optimeret min kode yderligere.

Min bedste tid i Fredags :  0.151831
Min bedste tid i Dag    :  0.149491

prøv det samme i VB. Så kommer du nok nærmere.

Her er min kode :

#include <stdio.h>

#define Cardinal unsigned
#define pCardinalArray Cardinal*
#define OutDig(dig) PDig[pos++] = char(48+dig)

char *PDig;
int  pos;

void __fastcall SetupDigits(const int len)
{
  PDig = new char[len+2];
  PDig[0] =\'3\';
  PDig[1] =\'.\';
  pos =2;
  PDig[pos] = \'\\0\';
}

Cardinal __fastcall Inner(pCardinalArray pi,  const Cardinal len)
{
  Cardinal j = 10;
  Cardinal Result = 0;
  Cardinal i = len;
  Cardinal x,k;

  while (i)
  {
    x = j*pi[i] + Result*i;
    k = i+i-1;
    Result = (x / k); //result = x div k

    pi[i] = x-Result*k;
    i--;
  }
  return Result;
}

void  __fastcall CalcPI(const int numdig)
{
  Cardinal i,nines,predigit;
  Cardinal len,q,qi;
  Cardinal *pi;

  int j;

  len = ((numdig*10) / 3); //len = (numdig*10) div 3
  pi = new Cardinal[len+1];

  for (i =1; i<=len; ++i)
    pi[i] = 2;

  nines = 0;
  predigit = 0;
  SetupDigits(len);

  j = numdig;

  do
  {
    qi = Inner(pi,len);
    q = qi /10; //q = qi div 10

    pi[1] = qi-q*10;

    if (q==9)
      nines++;
    else if (q==10)
    {
      OutDig(1+predigit);

      while (nines)
      {
        OutDig(0);
        nines--;
      }

      predigit = 0;
    }
    else
    {
        if (j<numdig)
          OutDig(predigit);

        while (nines)
        {
          OutDig(9);
          nines--;
        }

        predigit = q;
    }
  }while (j--);

  OutDig(predigit);
}

int main(int argc, char* argv[])
{
  LARGE_INTEGER Start, Stop, Freq;
  float p = 0;
  bool t = true;
  #define roundes 100
  while(t)
  {
    p= 0;
    printf(\"=================\\n\", p);

    for (int i=0; i<roundes; ++i)
    {
      QueryPerformanceCounter(&Start);
      CalcPI(1000);
      QueryPerformanceCounter(&Stop);
      QueryPerformanceFrequency(&Freq);
      float f = ((float)Stop.QuadPart - (float)Start.QuadPart) / (float)Freq.QuadPart;
      p += f;

      t= f>0.16;
        if (t)
        break;
   
      printf(\"%f\\n\", f);
    }
  }

  printf(\"=================\\n\", p);
  printf(\"%f\\n\\n\", (float)p / (float)roundes);
  printf(\"%s\\n\",PDig );
  return 0;
}


Jens B
Avatar billede borrisholt Novice
18. juni 2001 - 11:37 #35
du skal nok ikke sætte værdien til 0.16 på din computer fordi din computer er en anelse langsommere end min .... Sæt den til en værdi som de fleste tider ligger under ...

Jens B
Avatar billede psp_psp Nybegynder
18. juni 2001 - 14:16 #36
Jeg bruger PB(PowerBasic)...ikke VB. Iflg. PB\'s egne beregninger er PB mellem 3 og 23 gange hurtigere VB.

PB bruger ikke en run-time-dll ligesom VB. PB er en \"rigtig\" kompiler der laver meget små exe\'er og dll\'er. Disse exe\'er og dll\'er kører nogenlunde lige så hurtigt som C (tilsyneladende lidt langsommere). Hastighedsforskellen kan skydes at VC++ laver noget optimering bag ryggen på dig. Ved du noget om det?

Min fordom er at VB ville køre meget langsommere. Er der en VB\'er der kunne tænke sig at lave testet?

Jeg vil prøve at sortere de langsomme run\'s fra, sådan som du foreslår

Peter
Avatar billede borrisholt Novice
18. juni 2001 - 14:29 #37
Peter >> Din exe fil generer den en DOS consol eller en GUI. Ikke fordi det er rigtig intresant om filen er 34 eller 14 kb (in real life altså).

Optimering .. Ja Compileren optimerer, dog ikke det kode her fordi det er skrevet ud fra en ide om hvilke Assembler instruktioner det skulle blive til. Koden er tænkt i optimeret assembler, og skrevet i Delphi. Koden er der efter portet til C++ og rettet til så det kompilerede kode bliver det samme .... (Det er ikke første gang jeg deltager i den her slags juleleje).

Jens B
Avatar billede psp_psp Nybegynder
18. juni 2001 - 16:19 #38
Consol-kompileren giver en consol (det er den jeg har brugt her) DLL-kompileren bruges til GUI.

Jeg kom ned på 0.2058 ved at bruge din metode.

I princippet skulle det være muligt for mig at skabe den samme assember-kode som dig (uden at bruge asm). Du har nok ret i at det har noget løkke-strukturen at gøre. Jeg prøver mig frem...

Peter







Avatar billede borrisholt Novice
18. juni 2001 - 19:10 #39
Peter >> Entenlig burde vi ikke flue-kneppe så voldsomt, i stedet burde vi lave  nogle beregninger der taget LANG tid ... fx 1.000.000 decimaler 10 gange ... Og så måle tiden på DET. Det ville give et mere realistisk billede.

En klog mand har en gang sagt at hvis man skal lave performance tests skal det laves med et alm. ur med sekund viser. Det er det eneste der giver et realistisk billede.

Jeg vender tilbage i mogen med 10 x 1.000.000 cifere
Jens B
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
Kurser inden for grundlæggende programmering

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