Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

1 Zum Seitenanfang

Sonntag, 6. Februar 2011, 14:46

Mantisse

Moinsen,

wie zum Teufel berechnet man eine Mantisse?
Ich bin ja ein Mathe idiot, nur muss ich jetzt eine Matisse berechnen.

Kann mir jemand helfen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (6. Februar 2011, 15:09)

 

jperl

Super Moderator

Dabei seit: 09.04.2003

Beiträge: 3 453

 

2 Zum Seitenanfang

Sonntag, 6. Februar 2011, 14:51

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
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

3 Zum Seitenanfang

Sonntag, 6. Februar 2011, 15:18

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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (6. Februar 2011, 15:18)

 

jperl

Super Moderator

Dabei seit: 09.04.2003

Beiträge: 3 453

 

4 Zum Seitenanfang

Sonntag, 6. Februar 2011, 15:19

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.
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

5 Zum Seitenanfang

Sonntag, 6. Februar 2011, 16:03

Ich versteh die Formeln nicht.
was bedeutet x, was y,e,v,z,Z,V, log, l, e ?


Also es gibt die Funktion "doubleToLongBits".

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »nocturne« (6. Februar 2011, 16:03)

 

jperl

Super Moderator

Dabei seit: 09.04.2003

Beiträge: 3 453

 

6 Zum Seitenanfang

Sonntag, 6. Februar 2011, 16:23

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
Konfuzius [chinesischer Philosoph (551 - 479 v. Chr.)]
Das Entscheidende am Wissen ist, daß man es beherzigt und anwendet.
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

7 Zum Seitenanfang

Sonntag, 6. Februar 2011, 17:51

Ja, ich habe die Funktion von Delphi nachgebaut.
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)

 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

8 Zum Seitenanfang

Donnerstag, 7. Juli 2011, 15:22

Nach langem suchen hab ich es jetzt.
Tatsächlich kam ein anderes Problem hinzu:
Delphi rechnet mit Big-Endian, Java mit Little-Endian.

Ich habs also gelöst :D

[CLOSED]