Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hochrechnen (https://www.delphipraxis.net/8345-hochrechnen.html)

Pseudemys Nelsoni 2. Sep 2003 19:47


Hochrechnen
 
hi,

da in delphi ja ^ ein zeiger ist, frag ich mich wie ich rechnungen damit machen kann, ich brauch den ^ zum rechnen, man sagte mir es gäbe eine funktion, welche wäre diese?

Dagon 2. Sep 2003 19:50

Re: Hochrechnen
 
ja, die gibts: power

Pseudemys Nelsoni 2. Sep 2003 19:53

Re: Hochrechnen
 
hoi,

danke, sagst du mir auch noch ein besipiel wie es funktioniert?

Dagon 2. Sep 2003 19:56

Re: Hochrechnen
 
klar!

z. b. 4^5 -> power(4, 5);

also: power(Basis, Exponent);

braingrenade 2. Sep 2003 19:57

Re: Hochrechnen
 
unit math nicht vergessen !

Pseudemys Nelsoni 2. Sep 2003 19:58

Re: Hochrechnen
 
danke funktioniert :)

Pseudemys Nelsoni 2. Sep 2003 20:13

Re: Hochrechnen
 
hm ich bekomme das irgendwie nicht hin, ich möchte meine longip aus meiner ip berechnen...

normalerweise geht das ja mit:

a*256^3 + b*256^2 + c*256^1 + d*256^0


aber mit power krieg ich ein falsches ergebnis wieso das?

hatte es so geschrieben:

Delphi-Quellcode:
  r := power(213*256, 3) + power(39*256, 2) + power(156*256, 1) + power(54*256, 0);
(komisch das ich real nehmen muss obwohl doch auch integer gehen muss..)

naja das ergebnis ist jedenfalls falsch, oder hab ich was falsch gemacht?

Dagon 2. Sep 2003 20:25

Re: Hochrechnen
 
du darfst nich ausser acht lassen, das potenzen vor punktrechnungnen kommen!
du willst ja a*x^2=a*(x^2) rechnen.
du gibst aber power(a*x, 2) = (a*x)^2 ein.
du musst also schreiben: a * power(x, 2)

Pseudemys Nelsoni 2. Sep 2003 20:32

Re: Hochrechnen
 
hoi

aber ich muss ja das ergebnis von 213*256 in Power() angeben um es rechnen zu können oder

Pseudemys Nelsoni 2. Sep 2003 20:35

Re: Hochrechnen
 
ah nun gehts, danke nochmal :)

Pseudemys Nelsoni 2. Sep 2003 20:38

Re: Hochrechnen
 
nochmal ne allgemeine frage...
ist:

123*256^3 ... nicht das gleiche wie: 123 * (256*3) ...?

Sanchez 2. Sep 2003 20:46

Re: Hochrechnen
 
Nein 123*256^3 ...ist nicht das gleiche wie: 123 * (256*3),
sondern das gleiche wie 123 * (256 * 256 * 256)

grüße, daniel

Pseudemys Nelsoni 2. Sep 2003 20:47

Re: Hochrechnen
 
danke ;)

negaH 3. Sep 2003 00:35

Re: Hochrechnen
 
Zitat:

a*256^3 + b*256^2 + c*256^1 + d*256^0
Da hier mit Exponenten zur Basis 2 gerechnet wird und ich mal vermute das a,b,c,d nur Bytes sind geht diese Operation viel schneller mit

Delphi-Quellcode:
var
  I: Cardinal;
begin
  I := (A shl 24) + (B shl 16) + (C shl 8) + D;

// bzw.
  I := (A * $1000000) + (B * $10000) + (C * $100) + D;

// bzw.
  I := (A * 256 * 256 * 256) + (B * 256 * 256) + (C * 256) + D;

//        $1 = 1               = 256^0 = 2^0 
//      $100 = 256             = 256^1 = 2^8
//    $10000 = 256 * 256       = 256^2 = 2^16
//  $1000000 = 256 * 256 * 256 = 256^3 = 2^24

// und X shl Y = X * 2^Y
end;

Power() bzw. IntPower() sind für dieses Problem viel zu mächtige Geschosse :)

Gruß Hagen

Pseudemys Nelsoni 3. Sep 2003 00:40

Re: Hochrechnen
 
hallo hagen,

danke das du dir die mühe mit dem code gemacht hast, aber power() sieht für mich einfacher als dein code aus, wobei ich shl und shr nicht genau kenne (ok ich hab hilfe gelesen, aber schlau draus was genau sie bringen wurd ich nicht).

negaH 3. Sep 2003 00:58

Re: Hochrechnen
 
Power und IntPower sind
1.) viel zu ineffizient
2.) viel zu ungenau !! es können Rundungsfehler entstehen.

SHL und SHR sind ganz einfache Operationen und eigentlich ganz einfach zu verstehen. Sie multipliziren einen Wert mit einem Exponenten zur Basis 2. Damit ist SHL eine spezielle Form der Multiplikation X * Y zur Basis 2. X := Y * 2^e -> X := Y shl e.
SHR ist eine Division X := Y div 2^e --> X := Y shr e.

SHL heist Shift Left.
SHR heist Shift Right.

Alle Zahlen auf unseren Computer sind Binärzahlen also zu Basis 2.
Zb. 10 ist 2^3 + 2^1 = 8 + 2. Binär sehe das so aus

Code:
   
      4    3    2    1    0
     2^4  2^3  2^2  2^1  2^0
      16    8    4    2    1
 
10 =  0    1    0    1    0
Oben siehst du eine Tabelle mit 5 Spalten, jede Spalte representiert den Exponenten zur Basis 2, und darunter habe ich den mal ausgerechnet.
Die unterste Zeile ist unsere 10, bei jeder 1 müssen wir also mit dem darüberstehenden Wert rechnen. Also 10 = 8 + 2 = 2^3 + 2^1.

Ein Links Schift um 1 Bit wäre demnach 20 = 10 shl 1, und ein Rechtsshift um 1 wäre 5 = 10 shr 1
und sehe so aus:

Code:
       4    3    2    1    0
     2^4  2^3  2^2  2^1  2^0
      16    8    4    2    1
 
10 =  0    1    0    1    0
20 =  1    0    1    0    0    = 10 shl 1
 5 =  0    0    1    0    1    = 10 shr 1
Die oberste Zeile zeigt auch die Logische Bitnummer an.

Da SHL/SHR direkte Pascal Bezeichner für Maschinenbefehle sind, sind sie enorm effizient.

Gruß Hagen

PS: bevor einer meint das es noch effizientere Wege als SHL/SHR gibt, ja die gibt es besonders auf moderneren Rechnern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz