Autor Beitrag
volvox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 112

WIN XP
Delphi 7 Personal
BeitragVerfasst: So 25.11.07 14:12 
Hat delphi eine eingebaute funktion für Potenzen. Ich kenn nur sqr zum normalen quadrieren.
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: So 25.11.07 14:14 
ausblenden Delphi-Quelltext
1:
Power(Basis, Exponent)					
volvox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 112

WIN XP
Delphi 7 Personal
BeitragVerfasst: So 25.11.07 14:17 
thx
user32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: So 26.01.14 01:27 
Hi,

Ich bin am Rande der völligen Verzweiflung.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function aaa(bbb,ccc:Byte):Byte;
var
  Amount: byte;
  Dist: Byte;
begin
  Amount := round(Power(2,8));       // 64
  Dist := 256 div Amount;        // 4

  result := (bbb div Dist)*Dist;
end;

Bei Dist := 256 div Amount; bekomm ich ein Division By Zero!

Kann ich jetzt schon nicht mehr richtig rechnen, oder hat Delphi auf einmal einen Vollknall?
SEIT WANN SIND 2^8=0???

Beim Debuggen fällt mir auf, dass auf den Wert von Power nicht zugegriffen werden kann.
WAS ZUM TEUFEL

Bitte Hilfe!!!!!!!!!!
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: So 26.01.14 02:00 
Edit: --


Zuletzt bearbeitet von Mr_Emre_D am Sa 25.11.17 15:35, insgesamt 1-mal bearbeitet
user32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: So 26.01.14 02:07 
OMG. Hast recht. Zu viel Kaffee heute Abend... :roll:
Danke! XD
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 26.01.14 02:18 
Die ganze Funktion ist falsch!

function Power(Base, Exponent: Extended): Extended;
user32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: So 26.01.14 02:31 
Ja und? Ich will aber keine Extended verwenden, da ich sowieso nur ganzzahlige Inputs verarbeite
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 26.01.14 09:52 
Glaubst Du, DELPHI richtet sich danach, was Du willst?

function Power(Base, Exponent: Extended): Extended;

function Round ( const Number : Extended ) : Int64;


Beide Funktionen geben sich mit Bytes nicht zufrieden.

Ausserdem sind die Variablen-Bezeichnungen albern.
Kindergartenniveau?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 26.01.14 10:45 
Die Eingabe von Bytes in Power ist kein Problem. Die Ausgabe fängst du per Round ab, was einen Extended erwartet. Soweit alles ok. Bei der Rückgabe bekommst du einen Int64. Diesem kannst du zwar einem Byte zuweisen, allerdings gehen natürlich dann die ersten 56 bit verloren. Deswegen gilt am Ende auch 2^8=0.
Prinzipiell sehe ich da kein Problem.

Wenn es aber ohnehin nur um Bytes und Zweierpotenzen geht, dann wäre es auch viel einfacher, sicherer und effizienter möglich!

ausblenden Delphi-Quelltext
1:
2:
3:
power(2,8)-1 = not ($0) = MaxByte = 255
power(2,x)   = ($1shl x
power(2,8)   = ($1shl 8 = 0


PS: Das was in der Funktion passiert sieht mir irgendwie wie der Operator mod aus.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: So 26.01.14 14:18 
Am Einfchsten ist es doch wohl, wenn man den Variablentyp nimmt, der eh schon als Ergebnis herauskommt. Wenn Extended das Ergebnis ist, dann sollte man eben auch Extended nehmen, weil dann eine Transformation wegfällt. Oder bei Int64 eben longint, und nicht byte. Tut mir Leid, aber 2^8 zu rechnen und dies mit Byte ist ehrlich Unsinn, denn Byte hat nur den Wertebereich 0..255.

Auch wenn man meint, mit Kanonen auf Spatzen zu schießen, wenn man ja "nur" 2^5 oder 2^7 ... rechnen will und dabei longint nimmt, es ist besser, es zu tun, um genau direse Fehler zu vermeiden. Ansonsten steht für Potenzen von 2 auch noch SHL zur Verfügung.

2^1 = 2 SHL 0
2^2 = 2 SHL 1
:
2^7 = 2 SHL 6

Hier wird einfach das Bit 1 um 0, 1 bzw. 6 Stellen nach links verschoben, was jeweils einer Multiplikation mit 1, 2, 64 entspricht.
Aber selbst hier sollte man mindestens Integer oder Word als Variablentyp nehmen.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
user32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: So 26.01.14 18:05 
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Glaubst Du, DELPHI richtet sich danach, was Du willst?

function Power(Base, Exponent: Extended): Extended;

function Round ( const Number : Extended ) : Int64;


Beide Funktionen geben sich mit Bytes nicht zufrieden.

Ausserdem sind die Variablen-Bezeichnungen albern.
Kindergartenniveau?


Willst du mich anstressen oder was??? Ich lass mir von niemanden vorschreiben, wie ich zu programmieren habe...
Und DOCH, die geben sich mit Bytes zufrieden, weil der Compiler es automatisch anpasst.
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: So 26.01.14 18:12 
Zitat:
Der Artikel „Anstressen“ existiert in der deutschsprachigen Wikipedia nicht

Erkläre mal für das ältere Semester was das in deinen Augen bedeutet. Unabhängig vom Ergebnis ist es der Ton der die Musik macht. :roll:
user32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 5



BeitragVerfasst: So 26.01.14 18:15 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Am Einfchsten ist es doch wohl, wenn man den Variablentyp nimmt, der eh schon als Ergebnis herauskommt. Wenn Extended das Ergebnis ist, dann sollte man eben auch Extended nehmen, weil dann eine Transformation wegfällt. Oder bei Int64 eben longint, und nicht byte. Tut mir Leid, aber 2^8 zu rechnen und dies mit Byte ist ehrlich Unsinn, denn Byte hat nur den Wertebereich 0..255.

Auch wenn man meint, mit Kanonen auf Spatzen zu schießen, wenn man ja "nur" 2^5 oder 2^7 ... rechnen will und dabei longint nimmt, es ist besser, es zu tun, um genau direse Fehler zu vermeiden. Ansonsten steht für Potenzen von 2 auch noch SHL zur Verfügung.

2^1 = 2 SHL 0
2^2 = 2 SHL 1
:
2^7 = 2 SHL 6

Hier wird einfach das Bit 1 um 0, 1 bzw. 6 Stellen nach links verschoben, was jeweils einer Multiplikation mit 1, 2, 64 entspricht.
Aber selbst hier sollte man mindestens Integer oder Word als Variablentyp nehmen.


Nein, ist kein Unsinn... du weißt eben nicht was ich vorhabe. Zufällig befasse ich mich mit Bildbearbeitung/kompression und ein RGB Farbkanal hat ziemlich genau 1 Byte. Die Bitverschiebung kenne ich, wollte aber halt wissen wo der Wurm da in der Funktion drin war.

Ihr müsst nicht gleich so auf einem rumhacken, wenn man nach über 2 Jahren Pause mal wieder was mit Delphi macht dann können solche Fehler mal passieren :!:

Aber trotzdem danke!
Hochhaus
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: So 26.01.14 18:22 
user profile iconuser32 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Glaubst Du, DELPHI richtet sich danach, was Du willst?

function Power(Base, Exponent: Extended): Extended;

function Round ( const Number : Extended ) : Int64;


Beide Funktionen geben sich mit Bytes nicht zufrieden.

Ausserdem sind die Variablen-Bezeichnungen albern.
Kindergartenniveau?


Willst du mich anstressen oder was??? Ich lass mir von niemanden vorschreiben, wie ich zu programmieren habe...
Und DOCH, die geben sich mit Bytes zufrieden, weil der Compiler es automatisch anpasst.


Der Umgangston miteinander sollte möglichst höflich bleiben. Auch wenn gewisse Kritiken berechtigt sein mögen ...

Hochhaus
Mr_Emre_D
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 114
Erhaltene Danke: 14



BeitragVerfasst: So 26.01.14 18:39 
Edit: --


Zuletzt bearbeitet von Mr_Emre_D am Sa 25.11.17 15:35, insgesamt 1-mal bearbeitet
Lelf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42
Erhaltene Danke: 21



BeitragVerfasst: So 26.01.14 18:49 
@ user32

In Delphi ist z.B. const clPurple = $00800080 definiert. Ist wohl ein bißchen größer als 1 Byte.

Gruß Lelf
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: So 26.01.14 19:01 
user profile iconMr_Emre_D hat folgendes geschrieben Zum zitierten Posting springen:
@Xion
power(2,8 )-1 = not ($0) = MaxByte = 255

Viel eher:
power(2,8 )-1 = Byte(not ($0)) = MaxByte = 255

Weil Zahlen so im Sourcecode als Integer angenommen werden.. Damit wäre not 0 gleich 2^32 - 1 und somit $FFFFFFFF

@Tranx
2^1 = 2 SHL 0
2^2 = 2 SHL 1
:
2^7 = 2 SHL 6

Warum nicht:
2^1 = 1 SHL 1
2^2 = 1 SHL 2
:
2^7 = 1 SHL 7


Das ist richtig! Letztlich ist ein SHL nur die Multiplikation mit 2

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Hochhaus
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: So 26.01.14 19:20 
user profile iconuser32 hat folgendes geschrieben Zum zitierten Posting springen:
Und DOCH, die geben sich mit Bytes zufrieden, weil der Compiler es automatisch anpasst.


Bei einer Typumwandlung können aber Fehler passieren. Deshalb gibt der Compiler dann häufig eine Warnung heraus.
Siehe oben mit 2^8 = 0 (statt 256)


Hochhaus
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 27.01.14 19:01 
Moin,

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Glaubst Du, DELPHI richtet sich danach, was Du willst?
Glaubst du nicht, dass etwas Freundlichkeit mal angebracht wäre? Ich meine mich erinnern zu können, dass die Entwickler-Ecke "Deine freundliche Community" ist, und im Seitentitel stehts auch noch.

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Beide Funktionen geben sich mit Bytes nicht zufrieden.
Du machst das doch schon länger, das sollte doch bekannt sein? "Hoch"-konvertieren macht Delphi selber. Oder siehst du irgendwo überladene Versionen für single und double?

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Kindergartenniveau?
Merkste selber, ne?

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Wenn Extended das Ergebnis ist, dann sollte man eben auch Extended nehmen, weil dann eine Transformation wegfällt. Oder bei Int64 eben longint, und nicht byte.
8) Merkste selber, ne?

user profile iconhaentschman hat folgendes geschrieben Zum zitierten Posting springen:
Unabhängig vom Ergebnis ist es der Ton der die Musik macht. :roll:
Ohja, und in diesem Thema hat das ja mal so gar nicht geklappt. Ich würde mich freuen, wenn hier einige mal in sich gehen würden und nochmal kurz überlegen, ob das hier die richtige Reaktion auf einen Fragesteller ist. Und wenn man dann schon agressiv wird, sollte man sich doch wenigstens fachlich sehr sicher sein... :roll:

Viele Grüße,
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: Bergmann89, bole, Christian S., Hochhaus, Marc., Narses, Tranx, Xion