Autor Beitrag
Xabitire
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 114

Win Xp, Win Vista
D6 PE, D7 PE
BeitragVerfasst: Mo 14.01.08 17:47 
Hi Leute,

ich hab stehe gerade vor dem problem, dass Delphi bei den Funktionen cos und sin in 4 Fällen nicht exakt rechnet. Diese Fälle sind:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  cos(0.5*Pi);         //<-- gibt den Wert "-2,71050543121376E-20" zurück
  cos(1.5*Pi);         //<-- gibt den Wert "1,89735380184963E-19" zurück
  sin(Pi);             //<-- gibt den Wert "-5,42101086242752E-20" zurück
  sin(2*Pi);           //<-- gibt den Wert "1,0842021724855E-19" zurück

  //Bei korrekt angewandter Mathematik sollete soweit ich weiß bei allen Rechnungen "0" als Ergebnis rauskommen


Ich könnte das Problem zwar mit Runden wieder grade biegen, aber erstens würde ich gerne den genauen Wert benutzen und zweitens sollten die Funktionen gerade in diesen vier Fällen den richtigen Wert liefern!

Also, was haltet ihr davon und kennt vielleicht noch jemand eine andere, etwas ellegantere Lösung für das Problem?

Was mich übrigens auch mal noch interresieren würde ist, ob bei späteren Delphi-Versionen (ich benutze Delphi 7) das Problem immernoch vorliegt, oder ob es behoben wurde?

MFG Blackbird8690
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 14.01.08 17:50 
das problem könntest du mit einer Fremden Unit oder einer eigenen Procedure lösen. Mehr lösungen fallen mir nicht ein.

Da ich gerade kein Delphi zur Hand habe kann ich dir gerade nicht weiterhelfen im Punkto genauigkeit in anderen Versionen.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
DerDepp
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 21



BeitragVerfasst: Mo 14.01.08 18:15 
Mein Taschenrechner (immerfhin HP !) liefert: sin(2*PI) = 4,1E-13. Du siehst die Ungenauigkeit von Delphi bei Float-Rechnungen sind im Vergleich zum Taschenrechner vernachlässigbar.
Was ich daher davon halte? Passt schon.
Abend DeDe
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: Mo 14.01.08 18:27 
Seltsam. Ich bekomme auf einem Casio CFX9850 für sin(2*Pi) heraus: 0 in Radiant und 0,1094426069 in Grad. Delphi 2005 liefert mir aber auch von blackbird angegebenen Werte. Der Windows-Taschenrechner antwortet korrekt mit 0 (natürlich auch nur wenn er auf Rad umgestellt ist).

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 14.01.08 18:29 
schau dir mal die Genauigkeitenh der von Dir verwendeten Float-Typ an, die dürften Deine Ergebnisse alle gegen Null gerundet werden:
Zitat:

Typ | Bereich | Signifikante Stellen | Größe in Byte
Real48 -2,9 x 10^39 .. 1,7 x 10^38 11-12 6

Single -1,5 x 10^45 .. 3,4 x 10^38 7-8 4

Double -5,0 x 10^324 .. 1,7 x 10^308 15-16 8

Extended -3,6 x 10^4951 .. 1,1 x 10^4932 10-20 10

Comp -2^63+1 .. 2^63 10-20 8

Currency -922337203685477.5808
.. 922337203685477.5807 10-20 8

einfach in der IDE real bzw. extended eingeben und F1 drücken

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Xabitire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 114

Win Xp, Win Vista
D6 PE, D7 PE
BeitragVerfasst: Mo 14.01.08 19:06 
Zitat:
das problem könntest du mit einer Fremden Unit oder einer eigenen Procedure lösen.


Das hab ich mir auch schon gedacht, leider kenn ich weder fremde units, die über eine solche funktion verfügen und zum selbst schreiben weiß ich leider nicht, wie es geht (wobei mich das auch mal interresieren würde, aber bleiben wir beim Thema).

Bezüglich der verschiedenen Float-Typen:

Ich habs mal mit allen ausprobiert, und bei comp und currency gibt delphi korrekt den Wert Null zurück, bei allen anderen nicht!

Ich finde halt nur, dass so etwas eigentlich nicht sein sollte!
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 14.01.08 19:28 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure CheckNull(var AFloat: Double);
const 
  coEpsilon = 1E-10; //ev. anpassen für Extended etc.
begin
  if Abs(AFloat)<coEpsilon then AFloat := 0.0;
end;

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!