Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi mod mit Int64 (https://www.delphipraxis.net/85137-mod-mit-int64.html)

Klaus01 26. Jan 2007 13:19


mod mit Int64
 
Hallo,

nun, was ist mein Problem:

Ich habe folgenden Code:

Delphi-Quellcode:
  dateValue:= timeValue div(1000*24*60*60);
  timeValue := timeValue mod (1000*24*60*60);
wobei dateValue,timeValue Int64 sind.

Ich versuche folgenden Zahl zu dekodieren.
$10FE3F2C1AD -> 1167760474541

In dem Delphi Programm bekomme ich als DateValue diesen Wert: 13515
und als TimeValue diesen: 64474541 und das ist nicht richtig.

Mit dem Windows Rechner nachgerechnet ergibt sich folgendes:
DateValue: 13515
TimeValue: 746233113425925925925925926

Gibt es eine Möglichkeit mod Int64 fest zumachen,
oder gibt es einen Ersatz?

Oder sollte ich das, so wie in der Hilfe beschrieben, zu Fuß rechnen : x mod y = x – (x div y) * y

Einen schönen Nachmittag noch.

Grüße
Klaus

sirius 26. Jan 2007 13:46

Re: mod mit Int64
 
Der Compiler speichert int64-Werte einfach als 2 integer hintereinander, also
a:=4 (mit a vom int64) wird zu
Delphi-Quellcode:
asm
  mov dword ptr [esp], 4  ;low integer
  mov dword ptr [esp+4], 0 ;high integer
end;
Ein a mod b läfut allerdings so ab, dass er nur zwei 32bit (also nomrale) integer werte in eax<--a und edx<--b schiebt, und dann normal div macht. Dabei legt die ALU den ganzzahliegen Anteil des Ergebnisses in eax und den Rest in edx.

Anders gesagt, das mod ist eine integrierte Funktion der CPU. Diese läuft auf 32bit-CPUs auch nur in 32bit
Und du hast Recht, du müsstest dein modulo zu Fuß erledigen, so wie du es hingeschrieben hast.


Edit: Nee, Kommando zurück. Laut Debugger macht der ja etwas anderes, der hat eine Funktion namens _llmod.... und sieht alles ganz gut aus :gruebel:




[/delphi]

marabu 26. Jan 2007 13:51

Re: mod mit Int64
 
Hallo Klaus,

wenn es schnell gehen soll, dann nimm einfach UnixToDateTime().

Freundliche Grüße

Klaus01 26. Jan 2007 14:00

Re: mod mit Int64
 
Hallo Achim,

Zitat:

wenn es schnell gehen soll, dann nimm einfach UnixToDateTime().
hatte ich schon genommen, UnixToDateTime hat aber als kleinste Einheit
Sekunden. Ich brauche aber auch die Millisekunden.


Grüße
Klaus

Hawkeye219 26. Jan 2007 14:20

Re: mod mit Int64
 
Hallo Klaus,

ich habe 2 Fragen:

1. Warum hältst du das Ergebnis des Delphi-Programms für falsch?
2. Wie hast du mit dem Windows-Rechner diese gigantische Zahl erhalten?

Gruß Hawkeye

Klaus01 26. Jan 2007 14:38

Re: mod mit Int64
 
Zitat:

Zitat von Hawkeye219
ich habe 2 Fragen:

1. Warum hältst du das Ergebnis des Delphi-Programms für falsch?
2. Wie hast du mit dem Windows-Rechner diese gigantische Zahl erhalten?

Hallo Hawkeye,

1) weil nicht das herauskommt was herauskommen soll, deshalb
halte ich das Ergebnis für falsch.

2) die sehr lange Zahl ist nicht gigantisch. Sie ist der Nachkommateil wenn ich
1167760474541 durch (1000*24*60*60) teile.

Grüße
Klaus

marabu 26. Jan 2007 14:43

Re: mod mit Int64
 
Vielleicht ist mein Gehirn ja schon im Wochenende, aber ich würde UnixToDateTime(x div 1000) einsetzen und die Millisekunden erhältst du doch mit mod 1000 - oder doch?

Hawkeye219 26. Jan 2007 14:50

Re: mod mit Int64
 
Hallo Klaus,

Code:
1167760474541 div (1000*24*60*60) = 13515
1167760474541 mod (1000*24*60*60) = 64474541

13515 * (1000*24*60*60) + 64474541 = 1167760474541 // deine ursprüngliche Zahl
Ich kann keinen Fehler erkennen...

Deine Antwort zum Punkt 2 läßt mich ahnen, wo dein Denkfehler liegen könnte: MOD liefert den ganzzahligen Rest, nicht den Nachkommaanteil des Quotienten. Um aber allen (Verständnis-)Schwierigkeiten aus dem Weg zu gehen, könntest du ja marabus Vorschlag folgen.

Gruß Hawkeye

Klaus01 26. Jan 2007 15:08

Re: mod mit Int64
 
Hallo Hawkeye, Achim und Sirius,

wird Zeit das es Wochenende wird.

Zitat:

Deine Antwort zum Punkt 2 läßt mich ahnen, wo dein Denkfehler liegen könnte: MOD liefert den ganzzahligen Rest, nicht den Nachkommaanteil des Quotienten. Um aber allen (Verständnis-)Schwierigkeiten aus dem Weg zu gehen, könntest du ja marabus Vorschlag folgen.
Wünsche Euch ein schönes
Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 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