Power funktion

Antworten
Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Power funktion

Beitrag von Maik81SE »

Moin zusammen,

Jeder von euch kennt ja die Real function Power(x,y)
ich euch aber schon mal iwo, iwie, iwan eine Adequade Funktion über den Weg gelaufen, welche einen Integerwert als Rückgabe verwendet?
Ich würde gerne auf die Roundfunction zugreifen wollen, da diese halt unnötige Rechenzeit und Speichercode vergeudet.

ich hab die letzten Wochen nichts passendes verwendet.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Power funktion

Beitrag von theo »

In welcher Sprache ist dieser Beitrag geschrieben?
aquí se habla alemán. :wink:

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Power funktion

Beitrag von Winni »

Hi!

Das hab ich auch schon mal gesucht.
Ich habe keine Funktion gefunden, aber:

In der Unit math haben sie ** überladen:

Code: Alles auswählen


operator ** (bas,expo : int64) i: int64; inline;
Also kannst Du machen:

Code: Alles auswählen

uses ....., math;
.....
Ergebnis := 13 ** 42;

Winni

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Power funktion

Beitrag von wp_xyz »

Winni hat geschrieben:
Mi 3. Feb 2021, 19:01
Hi!

Das hab ich auch schon mal gesucht.
Ich habe keine Funktion gefunden, aber:

In der Unit math haben sie ** überladen:

Code: Alles auswählen


operator ** (bas,expo : int64) i: int64; inline;

Code: Alles auswählen

operator ** (bas,expo : int64) i: int64; inline;
  begin
    i:=round(intpower(bas,expo));
  end; 
Damit hast du das round wieder im Boot, das du eigentlich vermeiden wolltest.

Wenn die Exponenten nicht zu groß sind, was spricht eigentlich gegen mehrfache Multiplikation?

Code: Alles auswählen

function PowerInt(a, b: Integer): Int64;
begin
  if (a=0) and (b=0) then
    rause Exception.Create('0^0 gibt''s nicht.');
  if a = 0 then exit(0);
  if b = 0 then exit(1);
  if b < 0 then exit(0);
  Result := a;
  while b > 1 do
  begin
    Result := Result * a;
    dec(b);
  end;
end; 
Ob das aber schneller ist als round?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Power funktion

Beitrag von Winni »

wp_xyz hat geschrieben:
Mi 3. Feb 2021, 19:12

Wenn die Exponenten nicht zu groß sind, was spricht eigentlich gegen mehrfache Multiplikation?

Code: Alles auswählen

function PowerInt(a, b: Integer): Int64;
begin
  if (a=0) and (b=0) then
    rause Exception.Create('0^0 gibt''s nicht.');
  if a = 0 then exit(0);
  if b = 0 then exit(1);
  if b < 0 then exit(0);
  Result := a;
  while b > 1 do
  begin
    Result := Result * a;
    dec(b);
  end;
end; 
Ob das aber schneller ist als round?

Damit schränkst Du den Exponenten aber auf positive Integer ein.
Das muss man dabei schreiben.

Und round geht doch ganz simple.
Kann man sich selbst machen, wenn die RTL zu langsam ist:

Code: Alles auswählen

function MyRound(F:single) : Integer; inline
begin
result := trunc(F+0.5);
end;
Wer die Perfektion liebt und nicht die Geschwindigkeit, kann sich mit try auch noch ne Overflow-Exception einbauen.

Winni

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Power funktion

Beitrag von wp_xyz »

Winni hat geschrieben:
Mi 3. Feb 2021, 20:23
Damit schränkst Du den Exponenten aber auf positive Integer ein.
Wenn das ganze mit Integern laufen soll - und davon bin ich ausgegangen -, kann man keine negativen Exponenten zulassen: a^(-b) = 1/(a^b) --> kein Integer mehr. OK, eine Exception wäre vielleicht klarer. Aber ehrlichgesagt, ich weiß sowieso nicht, wozu so eine Funktion gut sein soll.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Power funktion

Beitrag von af0815 »

wp_xyz hat geschrieben:
Mi 3. Feb 2021, 22:04
Aber ehrlichgesagt, ich weiß sowieso nicht, wozu so eine Funktion gut sein soll.
Kann mir nur vorstellen, das das auf Arduinos etc. (sinnvoll) sein könnte.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Power funktion

Beitrag von Timm Thaler »

Für Arduino / AVR würde ich mir meine Power-Funktion selber schreiben. Soweit ich weiß, geht die aus der math.pp auf ARV embedded nicht.

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Power funktion

Beitrag von Maik81SE »

af0815 hat geschrieben:
Do 4. Feb 2021, 07:25
Kann mir nur vorstellen, das das auf Arduinos etc. (sinnvoll) sein könnte.
[/quote]
richtig... :D
Soll auf einem ATtinyx5 zum einsatz kommen.
Timm Thaler hat geschrieben:
Do 4. Feb 2021, 13:59
Für Arduino / AVR würde ich mir meine Power-Funktion selber schreiben. Soweit ich weiß, geht die aus der math.pp auf ARV embedded nicht.
Ja in dem Fall...
Schreib ich mir selbst eine und bei 8 Bit ist das kein Thema :mrgreen:

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Power funktion

Beitrag von Timm Thaler »

Maik81SE hat geschrieben:
Fr 5. Feb 2021, 09:50
Soll auf einem ATtinyx5 zum einsatz kommen.
Ja in dem Fall...
Schreib ich mir selbst eine und bei 8 Bit ist das kein Thema :mrgreen:
Hilf mir mal, aber mein FPC kann kein math.pp für AVR embedded. Also musst Du Dir Funktionen wie Power, Sin, Log... eh selber schreiben.

Und dann kannst Du die auf Deine Bedürfnisse optimieren. Wenn Du Hilfe brauchst, sag Bescheid.

Ich hab hier auch Mul, Div und Sqrt Routinen selbst erstellt, weil mir die "hauseigenen" für einige Projekte zu "ausladend" waren. Eine 16x16 zu 32bit-Multiplikation muss keine 5msec dauern, weil jemand das unbedingt in Software durchrödeln will.

Antworten