Autor |
Beitrag |
volvox
      
Beiträge: 112
WIN XP
Delphi 7 Personal
|
Verfasst: So 25.11.07 14:12
Hat delphi eine eingebaute funktion für Potenzen. Ich kenn nur sqr zum normalen quadrieren.
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: So 25.11.07 14:14
Delphi-Quelltext 1:
| Power(Basis, Exponent) |
|
|
volvox 
      
Beiträge: 112
WIN XP
Delphi 7 Personal
|
Verfasst: So 25.11.07 14:17
|
|
user32
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: 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
      
Beiträge: 114
Erhaltene Danke: 14
|
Verfasst: So 26.01.14 02:00
Zuletzt bearbeitet von Mr_Emre_D am Sa 25.11.17 15:35, insgesamt 1-mal bearbeitet
|
|
user32
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: So 26.01.14 02:07
OMG. Hast recht. Zu viel Kaffee heute Abend...
Danke! XD
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 26.01.14 02:18
Die ganze Funktion ist falsch!
function Power(Base, Exponent: Extended): Extended;
|
|
user32
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: 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
|
Verfasst: 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
      

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)
|
Verfasst: 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.
_________________ 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
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: 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
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: 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. 
|
|
user32
      
Beiträge: 55
Erhaltene Danke: 5
|
Verfasst: 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
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: So 26.01.14 18:22
|
|
Mr_Emre_D
      
Beiträge: 114
Erhaltene Danke: 14
|
Verfasst: So 26.01.14 18:39
Zuletzt bearbeitet von Mr_Emre_D am Sa 25.11.17 15:35, insgesamt 1-mal bearbeitet
|
|
Lelf
      
Beiträge: 42
Erhaltene Danke: 21
|
Verfasst: 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
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Hochhaus
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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. |  Merkste selber, ne?
haentschman hat folgendes geschrieben : | Unabhängig vom Ergebnis ist es der Ton der die Musik macht.  |
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...
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
|
|