Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Integerüberlauf bei Cardinalmultiplikation? (https://www.delphipraxis.net/53967-integerueberlauf-bei-cardinalmultiplikation.html)

Flocke 26. Sep 2005 20:54

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Zitat:

Zitat von Himitsu
Dat is'n Problem des DelphiCompilers ... es wird oftmals nicht wirklich darauf geachtet, ob signed, oder unsigned Integerroutinen verwendet werden.

Der einzige Grund könnte sein, dass vielleicht imul ein wenig schneller ist als mul. Wenn nur 32-Bits benötigt werden ist die Instruktion egal (s.u.). Allerdings brauchen laut Intel Spec. beide Instruktionen 3 µ-Ops, sollten also gleiche Laufzeit haben; auch werden beide in der U-Pipe ausgeführt. Vielleicht eine Optimierung für Prä-P4 CPUs (die Specs hab' ich nicht).

Zitat:

Zitat von Christian Seehase
Der Fehler eine vorzeichenbehaftete Multiplikation bei vorzeichenlosen Operanden durchzuführen, wurde bei SP1 also behoben.

Die vorzeichenbehaftete Multiplikation ist ja nicht der Fehler - da eh nur die unteren 32 Bits interessieren ist das Ergebnis gleich.

Beispiel (für 4-Bit x 4-Bit => 8-Bit):
Code:
1010 x 0101 = (10 x 5) = 50 = 0011[b]0010[/b]
1010 x 0101 = (-6 x 5) = -30 = 1110[b]0010[/b]
(die unteren 4 Bits sind gleich)

Das Problem ist, dass er danach über das Carry-Flag prüft ob ein Überlauf eingetreten ist (was bei imul der Fall ist, bei mul aber nicht) - und das ist falsch.

Aber wenn's mit Service Packs behoben wird, dann ist's ja in Ordnung.
IMHO ist aber durchaus sinnvoll, für ein Release die Überlaufprüfung auszuschalten.

(Edit: Tippfehler korrigiert)

himitsu 26. Sep 2005 22:43

Re: Integerüberlauf bei Cardinalmultiplikation?
 
net wirklich ... in der System-Unit gibt ja z.B. einige Routinen für die 64-Bit-Berechnung (je eine Variante mit und eine ohne Vorzeichen) und der Compiler nimmt halt mit Vorliebe die nur die signed-Versionen auch wenn es sich um LargeWord (unsigned) handelt ... vom aufbau her sind allerdings beide Prozeduren her fast gleich lang.

(ohne Überlaufprüfung) gibt es bei der Addition/Substraction kein Probleme und bei der multiplication fällt es auch kaum auf ... aber wenn man mal die divisionen(mul/div) betrachte . dann sieht das net mehr so net aus -.-''

aus diesem Grud hab i mir z.B. diese Funktionen mal extrahiert und rufe sie jetzt direkt auf (i nehme halt die Verantwortung dem Delphi ab)

Flocke 27. Sep 2005 09:12

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Hab' auch gerade mal in die System-Unit geschaut. Bei den vorzeichenbehafteten 64-Bit-Operationen gibt's jeweils Versionen mit und ohne Überlaufprüfung und bei denen mit steht der folgende Kommentar:
Zitat:

Zitat von System.pas
64-bit signed multiply, with overflow check (98.05.15: overflow not supported yet)
64-bit signed division with overflow check (98.05.15: not implementated yet)
64-bit signed modulo with overflow (98.05.15: overflow not yet supported)

Offensichtlich hat seit Mai '98 Niemand daran gedacht, die Überlaufprüfungen zu implementieren ... :?

himitsu 27. Sep 2005 09:34

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Hab ja gestagt, dat da einiges fehlt.

Und im Grunde genommen bleiben da nur noch drei Möglichkeiten, wenn man 100%ig sicher gehen will.
  • nur noch signet Integer (ShortInt, SmallInt, LongInt und LargeInt/Int64) verwenden
  • selber die nötigen Routionen bereit stellen
  • oder die krasse Variante:
    bei Programmstart den Status prüfen und wenn Fehler dat Programm wieder beenden ._.

Marcel Gascoyne 27. Sep 2005 10:08

Re: Integerüberlauf bei Cardinalmultiplikation?
 
Der Fehler ist bereits bekannt (siehe QC#2571), wurde in Delphi 7.1 (Build 7.0.8.1) behoben.

Gruß,
Marcel


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:36 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz