AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Multiplikation Int64*UInt64 fehlerhaft?

Ein Thema von Memnarch · begonnen am 12. Nov 2012 · letzter Beitrag vom 12. Nov 2012
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

Multiplikation Int64*UInt64 fehlerhaft?

  Alt 12. Nov 2012, 17:27
Delphi-Version: XE
Nabend,

Wollte mal wissen was gemacht wird wenn ich UInt64*Int64 multipliziere. im assembler steht der aufruf _llmul



kann aber nur die implementation finden, die besagt, dass beide parameter Int64 sind o.O

(habe ich mich verguckt?)
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Multiplikation Int64*UInt64 fehlerhaft?

  Alt 12. Nov 2012, 17:42
Ich würde vermuten dass UInt64 in dem Fall implizit (hart) auf Int64 gecastet wird.

Delphi scheint die vorzeichenbehafteten Typen zu bevorzugen:
Zitat von http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/expressions_xml.html:
the result is of type Int64 when at least one operand is of type Int64; otherwise, the result is of type Integer. If an operand's type is a subrange of an integer type, it is treated as if it were of the integer type.


Wenn die UInt64 Variable zu groß wäre, gäbe es ein Problem. Für Zahlen im positiven Wertebereich von Int64 funktioniert sollte das aber funktionieren.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (12. Nov 2012 um 17:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Multiplikation Int64*UInt64 fehlerhaft?

  Alt 12. Nov 2012, 17:58
Normalerweise würdest du an der Stelle "W1024: Combining signed and unsigned types - widened both operands (Delphi)" bekommen. Tjo, nur leider gibts kein Int128, auf den beide erweitert werden können.

Wie BUG schon richtig erwähnte, versucht Delphi natürlich das Vorzeichen zu behalten. Witzigerweise läuft da nicht alles so richtig ab:

Delphi-Quellcode:
var
  i1: Uint64;
  i2: UInt64;
  i3: Int64;
  i4: Uint64;
begin
  i1 := High(Int64);
  i4 := i1 * 2;
  Assert(i4 = High(UInt64) - 1); // läuft...

  i2 := 2;
  i4 := i1 * i2;
  Assert(i4 = High(UInt64) - 1); // läuft auch...

  i3 := 2;
  i4 := i1 * i3; // BOING! range check error?!
Vermutlich eine der vielen Stellen, wo UInt64 einfach buggy ist.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#4

AW: Multiplikation Int64*UInt64 fehlerhaft?

  Alt 12. Nov 2012, 20:57
Mh,
vllt sollte der Compiler dann eher das kombinieren von s/u Int64 "blocken" ? ("Operator not applicable for...")

oder wir führen Int128 und int256 ein
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

AW: Multiplikation Int64*UInt64 fehlerhaft?

  Alt 12. Nov 2012, 21:07
oder wir führen Int128 und int256 ein
Ich persönlich hätte nicht gegen generische Typen á la Int<bits> und UInt<bits> oder sogar Float<mantissa, exponent> .
Natürlich mit etwas Compilermagie, damit direkt vom Prozessor unterstützte Breiten auch schnell sind.

Aber da gibt es wohl zuwenig Anwendungsfälle für
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Multiplikation Int64*UInt64 fehlerhaft?

  Alt 12. Nov 2012, 23:18
Gibt es doch schon? (in XE3, aber seit TDE/D2006 könnte sich das jeder bequem selber basteln und selbst Lazarus sollte sowas hinbekomen )

unbenannt.png

UInt64 ist schon länger Buggy, aber es wurden von Zeit zu Zeit immer mehr Fehler ausgebaut.

Diese Typen werden ja nicht direkt von der CPU (FPU) unterstützt und werden emuliert.
Aber die letzen Fehler, welche ich kannte, bzw. mitbekommen hab, waren darin beegründet, daß der Compiler bei MUL, DIV und MOD für UInt64 versehentlich dennoch die Int64-Proceduren verwendet hatte.

Aber ich glaub das repariert keiner mehr, denn aus den 64-Bit Sourcen sind diese Codes rausgeflogen.
(die hätte man doch ganz gut für einen 128-Bit-Integer weiter nutzen können )
$2B or not $2B

Geändert von himitsu (12. Nov 2012 um 23:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Multiplikation Int64*UInt64 fehlerhaft?

  Alt 12. Nov 2012, 23:26
[del]
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 Uhr.
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