Power funktion
- Maik81SE
- Beiträge: 327
- Registriert: Fr 30. Sep 2011, 14:07
- OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
- CPU-Target: x86-64; avr
- Wohnort: Lübeck
- Kontaktdaten:
Power funktion
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.
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'
Re: Power funktion
In welcher Sprache ist dieser Beitrag geschrieben?
aquí se habla alemán.
aquí se habla alemán.

- 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
Hi!
Das hab ich auch schon mal gesucht.
Ich habe keine Funktion gefunden, aber:
In der Unit math haben sie ** überladen:
Also kannst Du machen:
Winni
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
uses ....., math;
.....
Ergebnis := 13 ** 42;
Winni
Re: Power funktion
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;
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;
- 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
wp_xyz hat geschrieben: Mi 3. Feb 2021, 19:12
Wenn die Exponenten nicht zu groß sind, was spricht eigentlich gegen mehrfache Multiplikation?Ob das aber schneller ist als round?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;
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;
Winni
Re: Power funktion
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.Winni hat geschrieben: Mi 3. Feb 2021, 20:23 Damit schränkst Du den Exponenten aber auf positive Integer ein.
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- 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
Kann mir nur vorstellen, das das auf Arduinos etc. (sinnvoll) sein könnte.wp_xyz hat geschrieben: Mi 3. Feb 2021, 22:04 Aber ehrlichgesagt, ich weiß sowieso nicht, wozu so eine Funktion gut sein soll.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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
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.
- Maik81SE
- Beiträge: 327
- Registriert: Fr 30. Sep 2011, 14:07
- OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
- CPU-Target: x86-64; avr
- Wohnort: Lübeck
- Kontaktdaten:
Re: Power funktion
Kann mir nur vorstellen, das das auf Arduinos etc. (sinnvoll) sein könnte.
[/quote]
richtig...

Soll auf einem ATtinyx5 zum einsatz kommen.
Ja in dem Fall...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.
Schreib ich mir selbst eine und bei 8 Bit ist das kein Thema

Code: Alles auswählen
label.caption:= 'gnublin.no-ip.info'
-
- 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
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.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![]()
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.