Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Potenzieren
volvox - So 25.11.07 14:12
Titel: Potenzieren
Hat delphi eine eingebaute funktion für Potenzen. Ich kenn nur sqr zum normalen quadrieren.
Chryzler - So 25.11.07 14:14
Delphi-Quelltext
1:
| Power(Basis, Exponent) |
volvox - So 25.11.07 14:17
thx
user32 - So 26.01.14 01:27
Hi,
Ich bin am Rande der völligen Verzweiflung.
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)); Dist := 256 div Amount; 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 - So 26.01.14 02:00
Edit: --
user32 - So 26.01.14 02:07
OMG. Hast recht. Zu viel Kaffee heute Abend... :roll:
Danke! XD
Delete - So 26.01.14 02:18
Die ganze Funktion ist falsch!
function Power(Base, Exponent: Extended): Extended;
user32 - So 26.01.14 02:31
Ja und? Ich will aber keine Extended verwenden, da ich sowieso nur ganzzahlige Inputs verarbeite
Delete - 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 - 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!
Delphi-Quelltext
1: 2: 3:
| power(2,8)-1 = not ($0) = MaxByte = 255 power(2,x) = ($1) shl x power(2,8) = ($1) shl 8 = 0 |
PS: Das was in der Funktion passiert sieht mir irgendwie wie der Operator
mod aus.
Tranx - 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.
user32 - So 26.01.14 18:05
hathor hat folgendes geschrieben : |
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 - 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 - So 26.01.14 18:15
Tranx hat folgendes geschrieben : |
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 - So 26.01.14 18:22
user32 hat folgendes geschrieben : |
hathor hat folgendes geschrieben : | 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 - So 26.01.14 18:39
Edit: --
Lelf - 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 - So 26.01.14 19:01
Mr_Emre_D hat folgendes geschrieben : |
@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
Hochhaus - So 26.01.14 19:20
user32 hat folgendes geschrieben : |
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 - Mo 27.01.14 19:01
Moin,
hathor hat folgendes geschrieben : |
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.
hathor hat folgendes geschrieben : |
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?
hathor hat folgendes geschrieben : |
Kindergartenniveau? |
Merkste selber, ne?
Tranx hat folgendes geschrieben : |
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?
haentschman hat folgendes geschrieben : |
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
Hochhaus - Mo 27.01.14 19:27
@Martok: Danke !!! Es braucht Mut, gewisse Sachen klarzustellen.
Hochhaus
Tranx - Di 28.01.14 07:48
Danke dafür, mich zurecht gewiesen zu haben.
Ich werde mich in Zukunft mehr zurückhalten.
WasWeißDennIch - Di 28.01.14 11:15
Mal etwas ganz anderes:
Delphi-Quelltext
1: 2: 3:
| Amount := round(Power(2,8)); Dist := 256 div Amount; result := (bbb div Dist)*Dist; |
Wenn also nicht ganz bewusst mit Überläufen gearbeitet wird, ist die ganze Funktion doch eigentlich sinnentleert, zumal der 2. Parameter ccc überhaupt nicht benutzt wird, oder mache ich gerade einen Denkfehler?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!