Gå til innhold

Lett oppgave: Hva er opphøyd "^" i Delphi


Anbefalte innlegg

Jeg burde egentlig kunne dette men hva er egentlig opphøyd. Altså "^" i Delphi. Rart for alt av tan, cos, sin, kvadratrot, ln, arcustan/cos/tan, log+++ var lett å finne ut av, men opphøyd. Jeg burde sikkert ha skjønt det, men nå gjør jeg ikke det.

 

Fint om en kunne bare nevnt det.

 

Driver bare å fikler med ett lite spill som jeg trenger å vite det i.

 

Takker på forhånd

Lenke til kommentar
Videoannonse
Annonse
  • 2 måneder senere...

En ^ brukes både som potenser (5^5 = 25), og noe som sier at en variabel skal behandles som pointer. For eksempel:

 

const
 lentoread: integer = 10;
var
 s: string;
 m: tmemorystream;
begin
 //Lage en memorystream
 m := tmemorystream.create;

 //Loade en fil vi skal lese en 10 bokstaver lang string fra
 m.loadfromfile('C:\fil.bin');

 //sette den nullte byten i stringen til lengen av det vi skal lese
 setlength(s,lentoread);

 //lese 10 bytes inn fra og med andre byte i stringen (det sørger ^ tegnet for)
 m.ReadBuffer(addr(s[1])^,lentoread);

 //frigjøre streamen
 freeandnil(m);

 //vise teksten vi har lest
 messagedlg(s);
end;

 

Enkelt og greit :).

Endret av chrml
Lenke til kommentar
  • 9 måneder senere...
En ^ brukes både som potenser (5^5 = 25), og noe som sier at en variabel skal behandles som pointer. For eksempel:

 

const
 lentoread: integer = 10;
var
 s: string;
 m: tmemorystream;
begin
 //Lage en memorystream
 m := tmemorystream.create;

 //Loade en fil vi skal lese en 10 bokstaver lang string fra
 m.loadfromfile('C:\fil.bin');

 //sette den nullte byten i stringen til lengen av det vi skal lese
 setlength(s,lentoread);

 //lese 10 bytes inn fra og med andre byte i stringen (det sørger ^ tegnet for)
 m.ReadBuffer(addr(s[1])^,lentoread);

 //frigjøre streamen
 freeandnil(m);

 //vise teksten vi har lest
 messagedlg(s);
end;

 

Enkelt og greit :).

grovt gammel tråd men allikevel...

 

^ er som du sier potens (eller eksponenten i en potens)...

du gir eksempelet konstant=5 og eksponent=5 (5^5), og sier svaret blir 25..

 

dette er et enkelt stykke men allikevel feil..

 

5^5 = 5*5*5*5*5 = 3125. Ikke 25..

Lenke til kommentar

hvordan bruker man eksponent i delphi forresten????

 

^ brukes for pointer..

 

ser det står noe om power og intpower over i tråden men hvordan skriver jeg dette i praksis?

"5 power 5" ser ikke riktig ut og virker heller ikke... hvordan????

 

 

eksempel kvadratrot: sqrt(inttostr(c^2-b^2))... her har jeg brukt ^ som eksponent tegn men det virker ikke...

 

 

Delphi syntax:
function Ldexp(const X: Extended; const P: Integer): Extended register;

 

fant denne i delphi help.. men hvordan bruker jeg deg..

Endret av lathorv
Lenke til kommentar

Eller Floor... Eller Round...

 

Ceil runder av oppover til nærmeste heltall, Floor runder av nedover til nærmeste heltall, og Round runder av til nærmeste heltall.

I akkurat dette tilfellet spiller det liten rolle hvilken som brukes, hvertfall så lenge du bare opphøyer et heltall i et annet heltall.

 

En bitteliten uformell test jeg kjørte viste at Round er den raskeste funksjonen av dem (hvertfall på min P4).. (ikke at du merker noen forskjell på dem med mindre du misbruker de stakkars funksjonene :))

Round krever heller ikke at du legger til Math i uses, siden den ligger i System.pas

Lenke til kommentar

Visste det var noe jeg hadde glemt, kunne bare ikke huske hva den het :p

Men du fikk nok en ekstra -h på slutten der, Trunc() skal det være..

Den gjør i grunn det samme som Floor(), men du slipper i det minste å legge til Math bare for den funskjonen.

Lenke til kommentar
  • 4 uker senere...

Vet ikke hva du skal med powerfunksjonen, men en generell powerfunksjon som regner ut X^(int y) er rimelig enkel:

 

(kan ikke delphi, så skriver pseudokode)

 

Funksjon Power( desimal x, heltall y ) returnerer desimaltall
   hvis y < 0
       x = 1 / x
       y = y * -1

   hvis y > 0
       y = y - 1
       returner Power( x, y ) * x
   ellers
       returner 1
Avslutt PowerFunksjon

 

Dersom man skal opphøye i et desimaltall, så må man finne en numerisk approksimasjon av funksjonen x^y, hvilket er en mye mer omfattende funksjon som jeg ikke kan ta ut av hodet sånn uten videre...

 

Funksjonen kan også optimeres betydelig ved å lage en tabell:

7^1997 = (7^1024)(7^512)(7^256)(7^128)(7^64)(7^8)(7^4)(7^1)

 

1997 er binært lik 11111001101 som tilsvarer 2. potensen av x, altså:

 

Som du ser er

7^1997 = (7^(1024*1))(7^(512*1))(7^(256*1))(7^(128*1))(7^(64*1))(7^(32*0))(7^(16*0))*(7^(8*1))(7^(4*1))(7^(2*0))(7^(1*1))

 

 

7^1024 = (7^512)*(7^512)

7^512 = (7^256)*(7^256)

7^256 = (7^128)*(7^128)

7^128 = (7^64)*(7^64)

7^64 = (7^32)*(7^32)

7^32 = (7^16)*(7^16)

7^16 = (7^8)*(7^8)

7^8 = (7^4)*(7^4)

7^4 = (7^2)*(7^2)

7^2 = (7^1)*(7^1)

7^1 = 7

 

Som du sikkert skjønner så bruker denne optimaliserte funksjonen 11 iterasjoner mens den først nevnte (rett fram funksjonen) 1997*2 iterasjoner på å regne ut 7^1997 og er betydelig mye tregere på store tall, men den er enklere å forstå og skrive.

 

Optimaliseringseksempelet er hentet fra http://mathforum.org/

 

Håper dette hjelper noen.

Endret av Mental
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...