Autor |
Beitrag |
IhopeonlyReader
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 09.04.13 14:57
Guten Tag,
ich habe mal eine Frage:
Delphi-Quelltext 1:
| FloatToStr( ( 1/((Now-NL)*24*60*60) )); |
(Now-NL)*86400 ist = die Differenz in Sekunden...
1/DifferenzInSekunden = wie oft es in der sekunde ausgeführt wurde..
soweit alles ok
allerdings:
Delphi-Quelltext 1: 2: 3:
| FloatToStr( ( 1/((Now-NL)*24*60*60) )); FloatToStr(Round ( 1/((Now-NL)*24*60*60) ); IntToStr(Round ( 1/((Now-NL)*24*60*60) ); |
da ich mich sehr über ein solchen Rundungsfehler wunderte, programmierte ich selber eine Rundungsfunktion
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:
Delphi-Quelltext 1: 2:
| FloatToStr(Runden( 1/((Now-NL)*24*60*60) ); IntToStr(Runden( 1/((Now-NL)*24*60*60) ); |
ein weiteres Wunder... darauf:
Delphi-Quelltext 1:
| FloatToStr(Trunc( 1/((Now-NL)*24*60*60) ); |
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 Narses: Beiträge zusammengefasstEdit: Auch
Delphi-Quelltext 1: 2: 3: 4: 5:
| var C: Extended; begin C := 1/((Now-NL)*24*60*60); IntToStr( Runden( C ) ); end; |
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 09.04.13 15:14
Und wenn Du testhalber einmal SecondsBetween aus DateUtils verwendest?
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 09.04.13 15:31
Hallo,
außer dass
Delphi-Quelltext 1: 2:
| FloatToStr(Round ( 1/((Now-NL)*24*60*60) ); IntToStr(Round ( 1/((Now-NL)*24*60*60) ); |
nicht stimmen können (schließende Klammern fehlen), habe ich Deine Routinen getestet:
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) ))); memo1.lines.add(FloatToStr(Round ( 1/((Now-NL)*24*60*60)))); memo1.lines.add(IntToStr(Round ( 1/((Now-NL)*24*60*60)))); 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 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 09.04.13 15:42
Was genau willst Du denn eigentlich berechnen?
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 09.04.13 15:43
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 public 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); end;
end. | Moderiert von Narses: Beiträge zusammengefasst WasWeißDennIch hat folgendes geschrieben : | Was genau willst Du denn eigentlich berechnen? |
FpS
_________________ Sucht "neueres" Delphi
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
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 09.04.13 15:53
WasWeißDennIch hat folgendes geschrieben : | 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 09.04.13 16:01
Dazu müsstest Du die Zeichnungen aber auch zählen, sonst fehlen Dir doch die Berechnungsgrundlagen.
|
|
IhopeonlyReader 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 09.04.13 16:13
Hallo,
IhopeonlyReader hat folgendes geschrieben : | 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:
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);
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 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Di 09.04.13 16:19
WasWeißDennIch hat folgendes geschrieben : | 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 09.04.13 16:26
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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 
      
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: 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
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Di 09.04.13 16:49
Hallo,
IhopeonlyReader hat folgendes geschrieben : | 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.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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.
|
|