ich vermute mal du meinst die mantisse?
die mantisse ist nicht wirklich schwer zu berechnen. hast du eine zahl zb. 2900 dann kannst du diese auch als 2,9 * 10^3 darstellen. die mantisse wäre dann 2,9.
das ganze kommt natürlich auch drauf an zu welcher basis du die mantisse haben willst. was hast du als zahl zur verfügung? eine normale gleitkommazahl?
jperl
die mantisse ist nicht wirklich schwer zu berechnen. hast du eine zahl zb. 2900 dann kannst du diese auch als 2,9 * 10^3 darstellen. die mantisse wäre dann 2,9.
das ganze kommt natürlich auch drauf an zu welcher basis du die mantisse haben willst. was hast du als zahl zur verfügung? eine normale gleitkommazahl?
jperl
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Ja Mantisse ist es.
Es muss also eine art Wurzel/Exponent durchgerechnet werden?
Vieleicht geht es konkreter:
In Java gibt es den Datentyp Timestamp
In Delphi gibt es dafür den Double.
Das "Delphi Datum" 2011-02-06 ist 40580
Die "Delphi Uhrzeit" für 23:00:00.000 ist 0,9583333333333333 (Das müsste die Komma-Zahl sein die du meinst)
In Delphi ist beides zusammen der wert 40580,9583333333333333, logisch.
Das ist ein Wert aus 8 Bytes (171,170,170,170,158,208,227,64) = 06.02.2011 23:00:00.000.
Ich möchte den wert von Java in Delphi umwandeln.
Gibt es da bereits einen Lösungsweg?
Es muss also eine art Wurzel/Exponent durchgerechnet werden?
Vieleicht geht es konkreter:
In Java gibt es den Datentyp Timestamp
In Delphi gibt es dafür den Double.
Das "Delphi Datum" 2011-02-06 ist 40580
Die "Delphi Uhrzeit" für 23:00:00.000 ist 0,9583333333333333 (Das müsste die Komma-Zahl sein die du meinst)
In Delphi ist beides zusammen der wert 40580,9583333333333333, logisch.
Das ist ein Wert aus 8 Bytes (171,170,170,170,158,208,227,64) = 06.02.2011 23:00:00.000.
Ich möchte den wert von Java in Delphi umwandeln.
Gibt es da bereits einen Lösungsweg?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (6. Februar 2011, 15:18)
Ja Mantisse ist es.
Es muss also eine art Wurzel/Exponent durchgerechnet werden?
du musst dir anschauen wie deine gleitkommazahl aufgebaut ist. einzelne bits stehen eben für mantisse bzw. exponenten.
das hier sollte dir helfen können:
http://de.wikipedia.org/wiki/Gleitkommaz…eitkommazahl.29
jperl
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
hast du schon verstanden wie delphi von den zahlen zu den datumswerten kommt?
wenn du nur die mantisse (m) zur basis 10 brauchst dann könntest du einfach den exponenten (e) und dann daraus die mantisse berechnen. aber inwieweit dir das hilft weiß ich nicht.
nur exemplarisch:
x = zahl;
e = (int) log(x);
m = x/10^e
wozu brauchst du die mantisse konkret? bzw. wie funktioniert die konvertierung von delphi.
jperl
wenn du nur die mantisse (m) zur basis 10 brauchst dann könntest du einfach den exponenten (e) und dann daraus die mantisse berechnen. aber inwieweit dir das hilft weiß ich nicht.
nur exemplarisch:
x = zahl;
e = (int) log(x);
m = x/10^e
wozu brauchst du die mantisse konkret? bzw. wie funktioniert die konvertierung von delphi.
jperl
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
Ja, ich habe die Funktion von Delphi nachgebaut.
Für das Datum:
Nach
Und von Zeit
Nach
Jetzt erstelle ich die Bytes:
Die Konvertierung in delphi ist einfach der Java-Bytearray:
Für das Datum:
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var I: Integer; DayTable: PDayTable; begin Result := False; DayTable := @MonthDays[IsLeapYear(Year)]; if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and (Day >= 1) and (Day <= DayTable^[Month]) then begin for I := 1 to Month - 1 do Inc(Day, DayTable^[I]); I := Year - 1; Date := I * 365 + I div 4 - I div 100 + I div 400 + Day - DateDelta; Result := True; end; end; |
Nach
|
|
Java-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
private static long getDateValue(Timestamp value) { long year = value.getYear(); boolean leap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); long days = value.getDate(); for (int i = 0; i < value.getMonth() - 1; i++) { days += daysOfYear[leap ? 1 : 0][i]; } long i = year - 1; long date = i * 365 + Math.round(i / 4) - Math.round(i / 100) - Math.round(i / 400) + days - 693584; return date; } |
Und von Zeit
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 |
function TryEncodeTime(Hour, Min, Sec, MSec: Word; out Time: TDateTime): Boolean; begin Result := False; if (Hour < HoursPerDay) and (Min < MinsPerHour) and (Sec < SecsPerMin) and (MSec < MSecsPerSec) then begin Time := (Hour * (MinsPerHour * SecsPerMin * MSecsPerSec) + Min * (SecsPerMin * MSecsPerSec) + Sec * MSecsPerSec + MSec) / MSecsPerDay; Result := True; end; end; |
Nach
|
|
Java-Quelltext |
1 2 3 4 5 |
private static double getTimeValue(Timestamp value) { double t = value.getHours() * (3600000) + value.getMinutes() * (60000) + value.getSeconds() * 1000; return t / (86400000); } |
Jetzt erstelle ich die Bytes:
|
|
Java-Quelltext |
1 2 3 4 5 6 7 |
@Override
public byte[] getBytes(Timestamp value, Annotation[] annos) {
long value1 = Double.doubleToLongBits(getDateValue(value)
+ getTimeValue(value));
return toByteArray(value1);
}
|
Die Konvertierung in delphi ist einfach der Java-Bytearray:
|
|
C/C++-Quelltext |
1 2 3 4 5 |
procedure recivie(d:array[] of byte) var k:record timestamp:TDateTime end absolute d; begin showmessage(datetimetostr(k.timestamp); end; |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »nocturne« (6. Februar 2011, 17:51)



