Autor Beitrag
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 14:57 
Guten Tag,
ich habe mal eine Frage:
ausblenden Delphi-Quelltext
1:
FloatToStr( ( 1/((Now-NL)*24*60*60) )); //(Now und NL sind vom Typ TDateTime)					

(Now-NL)*86400 ist = die Differenz in Sekunden...
1/DifferenzInSekunden = wie oft es in der sekunde ausgeführt wurde..
soweit alles ok :)

allerdings:
ausblenden Delphi-Quelltext
1:
2:
3:
FloatToStr( ( 1/((Now-NL)*24*60*60) )); //liefert korrekt 9,1762...
FloatToStr(Round ( 1/((Now-NL)*24*60*60) ); //liefert 91
IntToStr(Round ( 1/((Now-NL)*24*60*60) ); //liefert 91

da ich mich sehr über ein solchen Rundungsfehler wunderte, programmierte ich selber eine Rundungsfunktion
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Function Runden(Zahl: Extended): Integer;
  var Ganzzahl: Integer;
      PosNeg: Integer;
  begin
  if Zahl>0 then PosNeg := 1 else PosNeg := -1;
  Ganzzahl := Trunc(Zahl);
  if Frac(Zahl)>=0.5 then Result := Ganzzahl+(1*PosNeg) else Result := Ganzzahl;
  end;

jedoch:
ausblenden Delphi-Quelltext
1:
2:
FloatToStr(Runden( 1/((Now-NL)*24*60*60) ); //liefert 91
IntToStr(Runden( 1/((Now-NL)*24*60*60) ); //liefert 91


ein weiteres Wunder... darauf:
ausblenden Delphi-Quelltext
1:
FloatToStr(Trunc( 1/((Now-NL)*24*60*60) ); //liefert 91					


jetzt meine Frage: wieso wird aus 9.1 bei jeglicher rundungsart 91? wenn ich direkt Round(9.16746474946846...) schreibe, so ist das Ergebnis korrekt

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Edit: Auch
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var C: Extended;
begin
C := 1/((Now-NL)*24*60*60);
IntToStr( Runden( C ) ); //liefert 91
end;

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 15:14 
Und wenn Du testhalber einmal SecondsBetween aus DateUtils verwendest?
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 09.04.13 15:31 
Also, bei Delphi 5 wird so gerundet, wie zu erwarten ist. Keine falschen Ergebnisse (9,17 wird zu 9 gerundet). Allerdings habe ich now in eine zweite Variable NL2 gespeichert und nicht now - NL sondern NL2 - NL gerechnet.

P.S.: Auch bei Verwendung von now keine anderen Ergebnisse.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.


Zuletzt bearbeitet von Tranx am Di 09.04.13 15:32, insgesamt 1-mal bearbeitet
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 09.04.13 15:31 
Hallo,
außer dass
ausblenden Delphi-Quelltext
1:
2:
FloatToStr(Round ( 1/((Now-NL)*24*60*60) ); //liefert 91
IntToStr(Round ( 1/((Now-NL)*24*60*60) ); //liefert 91

nicht stimmen können (schließende Klammern fehlen), habe ich Deine Routinen getestet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var nl:tdatetime;
begin
     nl:=now-1/9.1762/86400;
     memo1.lines.add(FloatToStr( ( 1/((Now-NL)*24*60*60) ))); //liefert korrekt 9,1762...
     memo1.lines.add(FloatToStr(Round ( 1/((Now-NL)*24*60*60)))); //liefert 9 !!!!
     memo1.lines.add(IntToStr(Round ( 1/((Now-NL)*24*60*60)))); //liefert 8  !!!!
     memo1.lines.add(floattostr(1/9.1762/86400));
end;

liefern die Rundungen korrekte(!) Werte.
Die letzte Zeile habe ich aufgenommen, um zu sehen, welcher Zeitraum eigentlich gemessen wird. Es sind 0,109 s.
Also bei mir funktioniert es ohne Probleme.
Du müsstest wahrscheinlich mehr Quelltext zeigen, um den eigentlichen Fehler zu lokalisieren.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 15:33 
FloatToStr( Round( 1000/MilliSecondsBetween(NL,Now) ))
Muss es dann sein, da es ca 0.1 sec liefert SecondsBetween 0 aus...
Aus dem oben genannten befehl kommt sogar 901 raus

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 15:42 
Was genau willst Du denn eigentlich berechnen?
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 15:43 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  NL: TDateTime;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var T: String;
begin
   T := 'FpS: '+ FloatToStr( Round( 1/((Now-NL)*24*60*60) )); ;
   NL := Now;
   Canvas.TextOut(0, ClientHeight- Canvas.TextHeight(T), T);
   //weitere befehle
end;

end.


Moderiert von user profile iconNarses: Beiträge zusammengefasst

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Was genau willst Du denn eigentlich berechnen?

FpS

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!


Zuletzt bearbeitet von IhopeonlyReader am Di 09.04.13 15:47, insgesamt 1-mal bearbeitet
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 09.04.13 15:48 
Hallo,
unter www.delphipraxis.net...5759-exakte-fps.html findest Du einen Vorschlag mittels QueryPerformanceCounter, der relativ genau ist.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 15:48 
Die bekommst Du doch mit einem Timer gar nicht heraus. Wenn, dann müsstest Du irgendwie z.B. 1000 Frames zeichnen und die dafür benötigte Zeit messen oder andersherum eine definierte Zeit lang so schnell wie möglich Frames zeichnen und diese zählen. Daraus ließen sich dann die FpS ermitteln.
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 15:53 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Die bekommst Du doch mit einem Timer gar nicht heraus.

Ich mache das so:
Startbutton: - DateTime abspeichern ( NL )
- Timer anmachen

im Timer:
- Text:= FloatToStr( Round( 1/((Now-NL)*24*60*60) ));
- NL := Now;
- zeichnen
- canvas.textout

Edit: FpS ist vielleicht nicht ganz korrekt.. sondern die Zeichnungen pro Sekunde

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 16:01 
Dazu müsstest Du die Zeichnungen aber auch zählen, sonst fehlen Dir doch die Berechnungsgrundlagen.
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 16:03 
Es geht darum, anzuzeigen, wieviele Zeichnungen in der Sek geschafft werden würden, wenn sie in der Geschwindigkeit (Zeit) gezeichnet werden, wie das letzte

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 16:06 
Und wie soll Dir ein Timer da weiterhelfen? Sofern ich den Code richtig überblicke, würde eine Änderung des Timer-Intervalls signifikant andere Ergebnisse liefern.
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 09.04.13 16:13 
Hallo,
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
Es geht darum, anzuzeigen, wieviele Zeichnungen in der Sek geschafft werden würden, wenn sie in der Geschwindigkeit (Zeit) gezeichnet werden, wie das letzte

Mein Vorschlag:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var Time1, Time2, Freq: Int64;
    wert : extended;
begin
    QueryPerformanceFrequency(Freq);
    QueryPerformanceCounter(Time1);

    //hier Deine Zeichnung

    QueryPerformanceCounter(Time2);
    wert:=1000*(Time2-Time1)/freq;
    label1.caption:=floattostrf(wert,ffgeneral,4,3)+' ms';
    label2.caption:=floattostrf(1000/wert,ffgeneral,4,3)+' Bilder je s';
end;


Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 16:19 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
Und wie soll Dir ein Timer da weiterhelfen? Sofern ich den Code richtig überblicke, würde eine Änderung des Timer-Intervalls signifikant andere Ergebnisse liefern.


Wenn das Timer Intervall auf 1 steht?
Ich benutte den Timer eigentlich nur um eine Whilescleife zu vermeiden (damit sich das Programm nicht aufhängt), und da es auf die zeit zwischen Zeichnung 1 und Zeichnung 2 ankommt und das interval nun einmal dazwischen liegt, muss dies mitdrin sein
komischerweise:
T := 'FpS: '+ S + ' | '+Copy(S, 0, Pos(',', S)-1); // FpS: 9.0909 | 91
// oder manchmal auch: FpS: 9.909090| 910

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 09.04.13 16:26 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:

Wenn das Timer Intervall auf 1 steht?
Ich benutte den Timer eigentlich nur um eine Whilescleife zu vermeiden (damit sich das Programm nicht aufhängt)[...]


Moin,

genau das ist kein sinnvoller Ansatz. Wenn du Code so oft wie möglich ausführen willst, musst du schon eine (Endlos)schleife benutzen. Damit sich dein Programm nicht "aufhängte" empfehle ich:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
while(true)
begin
  doSth();
  Application.ProcessMessages();
end;
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 16:28 
Ein Timer-Interval von 1 kannst Du vergessen, nach meinem Kenntnisstand müsste das Minimum bei ca. 50 liegen. Außerdem ist ein Timer relativ ungenau, da er keine hohe Priorität hat. Wenn Dein Programm nicht blockieren soll, kommst Du m.M.n. mittelfristig nicht um einen Thread herum.
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 16:44 
dennoch stimmt die "Rundung" nicht.. vorallem bei dem Versuch mit Copy müsste es doch klappen! das heißt, der Compiler schreibt mein code irgendwie um :(

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 09.04.13 16:49 
Hallo,
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
dennoch stimmt die "Rundung" nicht..

Nein!!! Die Rundung stimmt (siehe weiter oben)! Derartige Fehler macht Delphi nicht.
Das Problem ist der Timer.
Da Du offensichtlich meine Beiträge ignorierst, klinke ich mich hier aus. :evil:

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 16:50 
Das glaub ich kaum. Speicher doch zunächst Now() einmal in einer Variablen zwischen und benutz dann die zur Berechnung. Dann schreibe Dir eine Funktion für die Ermittlung der Sekunden und benutze diese. Deren Ergebnis wird dann gerundet. Wenn dabei unterschiedliche Ergebnisse herauskommen, dann stimmt etwas mit Deinem Delphi nicht, aber das steht IMO eher nicht zu erwarten.