AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi verzweifle an fließkommazahlen....:-(
Thema durchsuchen
Ansicht
Themen-Optionen

verzweifle an fließkommazahlen....:-(

Offene Frage von "DJ_Tom"
Ein Thema von DJ_Tom · begonnen am 28. Dez 2005 · letzter Beitrag vom 31. Dez 2005
Antwort Antwort
Seite 1 von 3  1 23      
DJ_Tom

Registriert seit: 28. Mär 2005
14 Beiträge
 
#1

verzweifle an fließkommazahlen....:-(

  Alt 28. Dez 2005, 04:56
Hallo,

ich sitze hier schon stundenlang an einem vermutlich simplen Problem aber ich weiß ehrlich gesagt absolut nicht mehr weiter...

Also folgendes:

Ich schreibe mir in das folgende Array ein paar Speicherinhalte

Code:
buffer:array[1..100000] of double;
wenn ich mir das zur Laufzeit ansehe, was da so drin steht dann ist das z.b. sowas hier: 2.121995791e-314

Jetzt möchte ich diese Zahl mit einer Integer bzw. Longint vergleichen aber egal was ich anstelle ob ich versuche die mit round auf ne Integer-Zahl zu runden oder einfach per floattostr zu nem string konventieren will bekomme ich immer den fehler:

Üngültige Gleitkommaoperation

Wie kann man so ne Zahl handlen damit man sie mit ner Integer-zahl vergleichen kann...bzw. wie bekomme ich die Integer-Zahl auf dieses Format damit ich sie direkt vergleichen kann...

Das nächste Problem ist nämlich die Umwandlung der Double dauert ziemlich lang daher wäre es praktisch wenn man die Integer Zahl anpassen könnte....

Wäre Euch sehr dankbar wenn Ihr da ne Idee hättet....

Bis denne....
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: verzweifle an fließkommazahlen....:-(

  Alt 28. Dez 2005, 07:57
Herzlich willkommen in der Delphi-PRAXiS, DJ_Tom.

2.122e-314 ist aus Integer-Sicht nahe bei 0. Was willst du da noch vergleichen? Ansonsten funktionieren Round() und Trunc() auch in Verbindung mit Int64 - zumindest mit meiner Delphi Version.

Grüße vom marabu
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#3

Re: verzweifle an fließkommazahlen....:-(

  Alt 28. Dez 2005, 08:04
Zitat von DJ_Tom:
Hallo,

wenn ich mir das zur Laufzeit ansehe, was da so drin steht dann ist das z.b. sowas hier: 2.121995791e-314

Jetzt möchte ich diese Zahl mit einer Integer bzw. Longint vergleichen aber egal was ich anstelle ob ich versuche die mit round auf ne Integer-Zahl zu runden oder einfach per floattostr zu nem string konventieren will bekomme ich immer den fehler:

Üngültige Gleitkommaoperation

Wie kann man so ne Zahl handlen damit man sie mit ner Integer-zahl vergleichen kann...bzw. wie bekomme ich die Integer-Zahl auf dieses Format damit ich sie direkt vergleichen kann...

Bis denne....
Bei mir wird die oben genannte zahl ohne jede Fehlermeldung
a) mit Round in einen Integerwert (nämlich 0) umgewandelt
b) mit FloatToStr korrekt ausgegeben.

Bei anderen Werten, (die den Bereich eines Integers überschreiten) wird natürlich die Round Funktion nicht mitspielen, FloatToStr sollte aber funktionieren. Aber es gibt ein paar spezielle Werte, bei denen die FPU eine Exception auslöst.

Zitat:
Ich schreibe mir in das folgende Array ein paar Speicherinhalte
Ich vermute, Du hast keine korrekten Double-Werte, sondern, wie auch immer, irgendwelche Daten in das Array gestellt. Nicht jeder Wert der im Speicher stehen kann wird auch als gültige Zahl interpretiert.

Velleicht beschreibst Du mal, wie Du das Array gefüllt hast.
  Mit Zitat antworten Zitat
DJ_Tom

Registriert seit: 28. Mär 2005
14 Beiträge
 
#4

Re: verzweifle an fließkommazahlen....:-(

  Alt 28. Dez 2005, 13:33
erstmal danke für die schnellen antworten....

also zz benutzte ich folgenden code:

Code:

     a:=16777215;
     while a < 268435455 do
     begin
          readprocessmemory(HandleWindow, ptr(a),@buffer, sizeof(buffer), bytesread);

          for b:= 1 to 100000 do
          begin
               if buffer[b] = MeineGesuchteIntegerZahl then
               begin
                    //habe wert gefunden...                  
               end;
          end;

          a:=a+100000;
     end;
ich habe einfach mal angenommen das meine gesuchte zahl im bereich FFFFFF bis FFFFFFF liegt, dass müßte eigentlich immer reichen....

wenn ich den wert mit artmoney suche dann muss ich nach einem "float 8 Byte" wert suchen

oder gibt es eine bessere möglichkeit den speicher nach einer float 8 byte zahl zu durchsuchen?

bye
Tommy
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#5

Re: verzweifle an fließkommazahlen....:-(

  Alt 28. Dez 2005, 14:29
Wenn ich das richtig verstehe, dann transferierst Du mit readprocessmemory einen bestimmten Speicherbereich in Deinen Buffer und nimmst einfach als gegeben an, daß der Speicherbereich den Du in den buffer lädst ausschließich aus Double-Werten besteht.
Wer sagt Dir denn, daß das so ist ?
Und dann verläßt Du Dich darauf, daß auch tatsächlich der Buffer vollständig gefüllt ist.
Die tatsächlich geladene Anzahl Bytes steht in bytesread, und nur auf den Wert solltest Du Dich verlassen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: verzweifle an fließkommazahlen....:-(

  Alt 28. Dez 2005, 16:12
Hallo Tommy,

was auch immer du vorhast - die Suche nach einem double value funktioniert ohne Konvertierungsroutinen. Verwende einfach SysUtils.CompareMem() und alles wird gut.

Grüße vom marabu
  Mit Zitat antworten Zitat
DJ_Tom

Registriert seit: 28. Mär 2005
14 Beiträge
 
#7

Re: verzweifle an fließkommazahlen....:-(

  Alt 28. Dez 2005, 20:04
@Amateurprofi
hmmm ja hast schon recht aber wie soll ich denn nur die double werte auslesen?

das mit dem bytesread klingt logisch sollte man berücksichtigen...

@marabu

erstmal thx die compareMem funktion ist wirklich spitze....
wenn ich weiß welche adresse ich auslesen muß funktioniert das mit der funktion super, aber problematisch wird es immer dann wenn ich versuche den speicher in ein array zu packen und später wieder auszuwerten

und wie mir scheint kann compareMem ja nicht direkt speicherinhalte von anderen programmen vergleichen oder?!

also das ganze funktion wenn ich den buffer als normale double deklariere und jede adresse einzeln durchgehe nur das dauert bei dem umfang des durchzugehenden speichers natürlich ewig...
daher nehme ich mal an man muß schon sowas wie mit dem array machen oder?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: verzweifle an fließkommazahlen....:-(

  Alt 28. Dez 2005, 21:00
Ich versuche gerade zu verstehen, was du da eigentlich machst. Du suchst einen Integerwert im Hauptspeicher eines anderen Programms? Dazu besorgst du dir den Speicherinhalt in großen Blöcken. Du scheinst davon auszugehen, dass dein Integer-Wert als Double mit festem Alignment gespeichert ist. Darüberhinaus gibt es noch die Fallstricke, auf die dich Amateurprofi hingewiesen hat.

Wenn ein binärer Vergleich zulässig ist, dann kannst du deine Schleife über das Array dadurch beschleunigen, dass du einen Zeiger schiebst:

Delphi-Quellcode:
var
  pd: PDouble;
  d: Double;
  i: integer;
begin
  d := 123456;
  pd := @buffer[1];
  for i := 1 to 100000 do // beachte die Obergrenze
  begin
    if pd^ = d
      then Break
      else Inc(pd);
  end;
  // d gefunden bei index i, wenn i <= 1000000
end;
marabu

Letzten Kommentar präzisiert - wegen Klaus...
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#9

Re: verzweifle an fließkommazahlen....:-(

  Alt 29. Dez 2005, 08:44
marabu: sehr schöne und schnelle Lösung
Ich würde das dann aber besser so formulieren
Delphi-Quellcode:
var
  pd: PDouble;
  d: Double;
  i: integer;
begin
  d := 123456;
  pd := @buffer[1];
  for i := 1 to 100000 do // beachte die Obergrenze
  begin
    if int64(pd^) = int64(d) then
    begin
      // d gefunden bei index i
      exit;
    end else Inc(pd);
  end;
  // d nicht gefunden
end;
Warum :
Wenn der Wert nicht gefunden wurde kommt man nach Beendigung der for-schleife auch zu Deinem "Gefunden" Abschnitt.

Gruß, Klaus
  Mit Zitat antworten Zitat
DJ_Tom

Registriert seit: 28. Mär 2005
14 Beiträge
 
#10

Re: verzweifle an fließkommazahlen....:-(

  Alt 29. Dez 2005, 14:05
also zum auswerten is das ja schon so ne prima sache muß ganz ehrlich sagen das mit den zeigern is nicht so meine welt...

aber für das durchsuchen des speichers fehlt mir noch die ultimative lösung...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 04:52 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